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();
3 回答
调用 stop 的替代方法是使用中断向线程发出信号,表明您希望它完成它正在做的事情。(这假设您要停止的线程表现良好,如果它通过在抛出后立即吃掉它们来忽略 InterruptedExceptions 并且不检查中断状态,那么您将返回使用 stop()。)
这是我写的一些代码作为线程问题的答案,它是线程中断如何工作的示例:
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()
并wait()
立即抛出,否则你会卡住等待睡眠时间过去。请注意,不需要单独的布尔标志。
被停止的线程通过检查中断状态并在while循环之外捕获InterruptedExceptions(使用它退出循环)来进行合作。中断是一个可以使用异常进行流控制的地方,这就是它的全部意义所在。
在 catch 块中的当前线程上设置中断在技术上是最佳实践,但对于这个例子来说是多余的,因为没有其他东西需要设置中断标志。
关于发布的代码的一些观察:
发布的示例不完整,但是将对当前线程的引用放在实例变量中似乎是个坏主意。它将被初始化为创建对象的任何线程,而不是执行 run 方法的线程。如果同一个 Runnable 实例在多个线程上执行,那么实例变量大部分时间都不会反映正确的线程。
检查线程是否处于活动状态总是会导致 true(除非在 currentThread 实例变量引用错误线程时出现错误),
Thread#isAlive
只有在线程完成执行后才返回 false,它不会返回 false因为它被打断了。调用
Thread#interrupted
将导致清除中断标志,在这里没有任何意义,特别是因为返回值被丢弃了。调用Thread#interrupted
的目的是测试中断标志的状态,然后将其清除,这是 throw 的事物使用的一种方便方法InterruptedException
。
通常,线程在被中断时终止。那么,为什么不使用本机 boolean呢?尝试isInterrupted():
Thread t = new Thread(new Runnable(){
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
// do stuff
}
}});
t.start();
// Sleep a second, and then interrupt
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
t.interrupt();
这样做的好方法是使用布尔标志来向线程发出信号。
class MyRunnable implements Runnable {
public volatile boolean stopThread = false;
public void run() {
while(!stopThread) {
// Thread code here
}
}
}
创建一个名为 myrunnable 的 MyRunnable 实例,将其包装在一个新Thread
实例中并启动该实例。当你想标记线程停止时,设置 myrunnable.stopThread = true。这样,它就不会在某事中间停止,只会在我们期望它停止的地方停止。