Thread currentThread=Thread.currentThread();
public void run()
{
while(!shutdown)
{
try
{
System.out.println(currentThread.isAlive());
Thread.interrupted();
System.out.println(currentThread.isAlive());
if(currentThread.isAlive()==false)
{
shutdown=true;
}
}
catch(Exception e)
{
currentThread.interrupt();
}
}
}
});
thread.start();
调用 stop 的替代方法是使用中断向线程发出信号,表明您希望它完成正在执行的操作。 (这假设您要停止的线程表现良好,如果它在抛出 InterruptedExceptions 后立即将其吃掉,从而忽略它们,并且不检查中断状态,那么您将返回使用 stop()。)
这是我为回答线程问题而编写的一些代码here https://stackoverflow.com/questions/5097387/java-re-doing-a-piece-of-code-using-threads/5097597#5097597,这是线程中断如何工作的示例:
public class HelloWorld {
public static void main(String[] args) throws Exception {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
Thread.sleep(5000);
System.out.println("Hello World!");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
thread.start();
System.out.println("press enter to quit");
System.in.read();
thread.interrupt();
}
}
需要注意的一些事项:
中断原因sleep()
and wait()
立即抛出,否则你将陷入等待睡眠时间过去的状态。
请注意,不需要单独的布尔标志。
被停止的线程通过检查中断状态并在 while 循环之外捕获 InterruptedException(使用它来退出循环)来进行协作。中断是可以使用异常进行流量控制的地方,这就是它的重点。
在 catch 块中的当前线程上设置中断从技术上讲是最佳实践,但对于本例来说有点矫枉过正,因为没有其他东西需要设置中断标志。
关于发布的代码的一些观察:
发布的示例不完整,但将对当前线程的引用放入实例变量中似乎是一个坏主意。它将被初始化为创建对象的任何线程,而不是执行 run 方法的线程。如果同一个 Runnable 实例在多个线程上执行,则实例变量大多数时候不会反映正确的线程。
检查线程是否处于活动状态必然总是导致 true(除非出现错误,其中 currentThread 实例变量引用了错误的线程),Thread#isAlive
只有在线程完成执行后才为 false,它不会仅仅因为被中断而返回 false。
Calling Thread#interrupted
将导致清除中断标志,并且在这里没有任何意义,特别是因为返回值被丢弃。打电话的要点Thread#interrupted
是测试中断标志的状态然后清除它,这是抛出异常的东西使用的一种便捷方法InterruptedException
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)