本文目录一览:
1、Java里如何暂停一个线程,达到一定条件后又唤醒线程?
2、java多线程暂停
3、JAVA中如何控制线程的启动与暂停
4、java如何实现线程的启动和暂停
Java里如何暂停一个线程,达到一定条件后又唤醒线程?
thread1 {
run() {
synchronized(obj) {
while(条件1不满足) obj.wait();
//下面写满足后的操作
}
}
}
//线程2中将条件1满足,然后唤醒线程1
thread2 {
run() {
synchronized(obj) {
//使条件1满足
obj.notifyAll();
}
}
}
obj
一定要是对同一个对象的引用
java多线程暂停
由于Java废弃了suspend
和resume
,所以目前来看使用Thread
类貌似没有不修改线程的执行体而从外部暂停线程的方法。JavaDoc里面推荐的方法是在外部通过某种方法把暂停和恢复的要求通知给线程对象,比如用public
属性,然后由线程的执行体自己隔一段时间进行一次自主判断,如果需要暂停就用wait
或者sleep
或者某些其他的方法暂停,而恢复运行的话根据暂停的方法不同有不同的选择,比如用wait
暂停可以用notify
恢复运行,用sleep
则等待时间到,或者可以用interrupt
恢复。
而yield
的话我觉得可能不能达到目的,首先yield
本身也是必须由线程执行体自主执行,而不是线程外部执行的,然后yield
照我的理解是让线程暂时离开运行状态但并不阻塞,而是进入就绪状态等待下一次调度,所以并不能保证线程暂停。当然yield
本身执行之后因为没有阻塞所以并不需要显式的恢复。
如果你的线程执行体里面是循环的话,好写一些,只要每次循环的时候检测暂停或者恢复的外部要求就行了,不过如果是顺序执行,可能只有每隔一段就插入一次检测了。
当然也可以找找Thread
类之外的方法。
JAVA中如何控制线程的启动与暂停
线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务。线程有创建、可运行、运行中、阻塞、死亡五种状态。一个具有生命的线程,总是处于这五种状态之一:
- 创建状态
使用new
运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)。 - 可运行状态
使用start()
方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)。 - 运行中状态
Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running)。此时,系统真正执行线程的run()
方法。 - 阻塞状态
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)。 - 死亡状态
线程结束后是死亡状态(Dead)。 创建线程和启动线程并不相同。在一个线程对新线程的Thread
对象调用start()
方法之前,这个新线程并没有真正开始执行。Thread
对象在其线程真正启动之前就已经存在了,而且其线程退出之后仍然存在。这可以让您控制或获取关于已创建的线程的信息,即使线程还没有启动或已经完成了。 通常在构造器中通过start()
启动线程并不是好主意。这样做,会把部分构造的对象暴露给新的线程。如果对象拥有一个线程,那么它应该提供一个启动该线程的start()
或init()
方法,而不是从构造器中启动它。
结束Java线程
Java线程会以以下三种方式之一结束:
- Java线程到达其
run()
方法的末尾。 - Java线程抛出一个未捕获到的
Exception
或Error
。 - 另一个Java线程调用一个弃用的
stop()
方法。弃用是指这些方法仍然存在,但是您不应该在新代码中使用它们,并且应该尽量从现有代码中除去它们。 当Java程序中的所有线程都完成时,程序就退出了。
java如何实现线程的启动和暂停
Thread thread = new Thread(obj);
thread.start(); // 开始
thread.sleep(30000); // 暂停
thread.stop(); // 停止