关于java多线程wait 和sleep方法

发布网友 发布时间: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中多线程同步控制的关键概念。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com