并发基础(九) 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

posted @ 2018-02-28 22:21  jinggod  阅读(717)  评论(0编辑  收藏  举报