Java线程防止暴力终止的正确姿势

防止线程的暴力终止


避免stop终止线程造成死锁

public class MyThread extends Thread { 
	//信号量
 	volatile boolean  isRun=true;//是否运行 
	@Override 
	public void run() { 
		int i=0; 
		while(isRun && !Thread.interrupted)){ 
		try { 
			Thread.sleep(50);//让线程阻塞 
			System.out.println(Thread.currentThread().getName()+"i="+i); 
			i++; 
		} catch (InterruptedException e) { 
			e.printStackTrace(); 
			this.interrupt();//如果线程阻塞报错, 相当于信号又重置了, 
			//这个时候 需要再打一个信号量 
		} 
	} 


	//取消线程运行 
	public void cancel(){ 
		this.isRun=false; 
		this.interrupt();//当调用了interrupt之后,如果线程被阻塞 则立即报错 
	} 


	public static void main(String[] args) throws InterruptedException { 
		System.out.println("主线程开始运行....."); 
		MyThread mt=new MyThread(); 
		mt.setName("子线程"); 
		mt.start(); 
		Thread.sleep(2000); 
		mt.cancel();//终止线程的方法, stop 太暴力了 不应该强制终止   也容易导致死锁 
		System.out.println("主线程运行结束...."); 
	} 
}

你可能感兴趣的:(Java)