发布网友 发布时间:2024-12-20 11:19
共1个回答
热心网友 时间:9分钟前
一.概念、原理、区别
Java中的多线程,是一种抢占式的机制,而非分时机制。线程存在可运行、运行、阻塞、死亡四种状态。抢占式机制下,可运行状态的线程中,只有一个线程在执行。
当多个线程共享资源时,需要同步。Thread类和Object类提供了sleep(),yield(),wait(),notify()等方法用于控制线程执行。
每个对象拥有一个锁用于同步访问。Synchronized关键字能与对象锁交互,实现线程同步。
虽然sleep()能暂停线程,但它不释放锁,故在同步方法中调用sleep()时,线程虽休眠,但锁未释放,其它线程无法访问。wait()则释放锁,让其它线程访问。
yield()使当前线程让出CPU给同等优先级的线程,若无同等优先级线程,不执行。
线程结束标志为run()方法执行结束。
锁释放标志为synchronized块或方法结束。
wait()和notify():执行wait()时,线程进入等待池,释放锁。被notify()唤醒时,线程回到wait前中断状态。
join()使当前线程等待直到另一个调用join线程终止。
线程在被激活后,不一定立即执行,而是进入可运行线程队列。
共同点:阻塞指定毫秒数并返回。
不同点:sleep()无需同步锁,wait()需同步锁。
二. Thread的Interrupt方法与Sleep,Wait
wait()和sleep()可通过interrupt()结束暂停状态,引发InterruptedException。Thread类的interrupt方法能立即结束线程,若线程执行wait(),sleep()或join(),中断会立即生效。
InterruptedException由线程自身抛出,不是interrupt方法抛出。若线程执行普通代码,不会抛出InterruptedException,但进入wait()/sleep()/join()时会。
三. Java中Sleep,Wait的使用
程序分析:synchronized(b)限定线程b作为锁。b.wait()释放锁,阻塞线程,等待唤醒。唤醒后线程回到中断前状态。
wait()和notify()用于线程同步控制,wait()暂时释放锁,允许其他线程使用,notify()唤醒等待线程。
通过以上分析,理解Java中多线程同步控制的关键概念。