zoukankan      html  css  js  c++  java
  • 并发基础(九) 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

  • 相关阅读:
    事例学习开发WEBSERVER服务器(一)
    一个简单的减法程序看看基本功
    Linux 网络编程一步一步学(三)循环读取服务器上的数据
    screen配置——screenrc
    ubuntu NGINX LUA安装
    Linux 网络编程一步一步学(二)绑定IP 和端口
    git常用命令
    浅谈算法——冒泡排序
    ack 安装和使用事例
    Linux 网络编程一步一步学(六)客户/服务端通信
  • 原文地址:https://www.cnblogs.com/jinggod/p/8486134.html
Copyright © 2011-2022 走看看