并发基础(九) java线程的终止与中断

1、简单了解一下:为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

  suspend 、resume、stop方法分别完成了线程的暂停、恢复、终止的工作。不建议使用原因:是因为这三个方法带来的副作用,如suspend( )方法,调用后,线程就会一直占用资源睡眠,直到调用resume( )恢复后,才可以运行。这样很容易引发死锁。同样,stop( )方法在终结一个线程时不会保证线程的资源正常释放,因此会导致程序可能工作在不确定的状态下。
  线程的暂停、恢复操作可以用 等待/通知 机制来替代。但线程的终止就要用户去实现了。

详细可参考:http://bjzhkuang.iteye.com/blog/1748396

2、如何优雅安全地终止线程

  终止一个线程 本质上就是线程间的通信交互的过程。因此,线程间的通信方式:共享变量、流、中断都可以用来实现终止线程的机制。最常用的方式便是“中断”;
下面的例子是:除了中断,还可利用boolean变量来控制是否需要终止线程;

public class ThreadTest{
public static void main(String[] args) throws InterruptedException {
    MyTask taskOne = new MyTask();
    Thread threadOne = new Thread(taskOne,"threadOne");
    threadOne.start();
    TimeUnit.MILLISECONDS.sleep(500);
    threadOne.interrupt();

    MyTask taskTwo = new MyTask();
    Thread threadTwo = new Thread(taskTwo,"threadTwo");
    threadTwo.start();
    TimeUnit.MILLISECONDS.sleep(500);
    taskTwo.cancel();
}

private static class MyTask implements Runnable{

    //要加上volatile 修饰符,保证内存的可见性,及时更新变量值
    private volatile boolean on = true; 
    private long i;

    @Override
    public void run() {
        //调用cancel、或者中断都可以终止线程
        while(on && !Thread.currentThread().isInterrupted()){
            i++;
        }
        System.out.println("线程"+Thread.currentThread().getName()+" Count i = "+i);
    }

    public void cancel(){
        on = false;
    }   
}
}

运行结果:

线程threadOne Count i = 239418320
线程threadTwo Count i = 235374425

出处:http://www.cnblogs.com/jinggod/p/8486134.html

猜你喜欢

转载自blog.csdn.net/sihai12345/article/details/81194543