public class ThreadInterrupted
{
public static void main(String[] args) throws InterruptedException {
ThreadDemo demo1 = new ThreadDemo("线程1");
ThreadDemo demo2 = new ThreadDemo("线程2");
demo1.start();
demo2.start();
// demo1.stop();
Thread.sleep(1000);
demo1.interrupt();
}
}
class ThreadDemo extends Thread{
public ThreadDemo(String name) {
this.setName(name);
}
@Override
public void run() {
while(!interrupted()) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" is running");
}
}
}
1.stop()方法:用stop() 方法会真的杀死线程,不给线程喘息的机会,如果线程持有 ReentrantLock 锁,被 stop() 的线程并不会自动调用 ReentrantLock 的 unlock() 去释放锁,那其他线程就再也没机会获得 ReentrantLock 锁,这实在是太危险了。所以该方法就不建议使用了,类似的方法还有 suspend() 和 resume() 方法,这两个方法同样也都不建议使用了
2.interrupt():从线程的生命周期了解到,一个线程要终止,必须要从runnable状态到terminated。而线程可能处于休眠状态,interrupt方法恰好提供了此功能,它可以将休眠状态的线程转换到runnable状态,并置标志位为true(此时Thread.currentThread().isInterrupted()==true)。