您的位置:首页 > 编程语言

多线程编程艺术(2)-安全的终止线程

2016-05-25 17:49 225 查看
本文内容来源于《多线程编程艺术》一书,本人阅读过程的总结

suspend()、resume()和stop()方法可以完成了线程的暂停、恢复和终止工作,而且非常“人性化”。但是这些API是过期的,也就是不建议使用的。不建议使用的原因主要有:以suspend()方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。

正因为suspend()、resume()和stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法,而暂停和恢复操作可以用后面提到的等待/通知机制来替代。

可以利用一个boolean变量来控制是否需要停止任务并终止该线程。
代码实例如下:

public static void main(String[] args) throws Exception{
Runner one = new Runner();
Thread countThread = new Thread(one, "CountThread");
countThread.start();        // 睡眠1秒,main线程对CountThread进行中断,使CountThread能够感知中断而结束
TimeUnit.SECONDS.sleep(1);
countThread.interrupt();
Runner two = new Runner();
countThread = new Thread(two, "CountThread");
countThread.start();        // 睡眠1秒,main线程对Runner two进行取消,使CountThread能够感知on为false而结束
TimeUnit.SECONDS.sleep(1);
two.cancel();

}

private static class Runner implements Runnable{
private long i ;
private volatile boolean on =true;
@Override
public void run() {
while(on && !Thread.currentThread().isInterrupted()){
i++;
}
System.out.println(i);
}

public void cancel(){
on =false;
}

}


通过标识位或者中断操作的方式能够使线程在终止时有机会去清理资源,而不是武断地将线程停止,因此这种终止线程的做法显得更加安全和优雅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程