Java-初步认识-第十四章-多线程-停止线程方式-interrupt

一.

结合上一节继续讲述,不要以为设置了标记线程就能停止,依旧有停不下来的情况。

整个函数就是添加了wait()方法,导致try-catch的加入。

DOS结果显示,程序没有停下来,和主线程结束了。其余两个线程都没结束,都处于等待状态。

这两个线程拿到锁进来后,都wait停在这了。

设置标记也没用,因为这两个线程就没读到标记。

有人说采用notify方法,但是notify要在同一个锁中,在这个程序中放不了。

如果程序中不用wait,用sleep呢?而且sleep时间比较长,比如说一个小时,没有一个小时根本醒不了。(这里就是说即使不是wait方法,换成sleep方法,也会出现线程没结束的情况,这样该怎么处理?)

接下来,介绍一种新方式。这种方式原理还是一样的,表现形式不一样。

什么叫中断?正在运行,突然停止了,这就是中断,中断其实就是一种冻结状态。而这个interrupt方法可以将中断状态清除掉。清除就是指它结束中断状态,继续运行。

interrupt是在将线程的冻结状态清除掉,让线程恢复到具备着cpu执行资格的状态。这和之前的notify有什么区别呢?不用notify,都能把线程从wait唤醒回来,不用等你时间到都可以从sleep状态回来。这种做法有点强制性,所以会抛出异常。它在不该醒的时候,你把它弄醒了。

我们将st.setFlag();该为两个线程中断。DOS结果显示如下,

(具体的内容再去看视频)

(但是)

如果你连标记都没读到,我就让你读标记,怎么让它读标记?直接调用interrupt先从状态中拉回来再说。中断异常,冻结状态异常。

当我们有些运行中的线程处在这种状态,但我们程序准备结束的时候,我们有可能强制地将这些线程从冻结状态拉回运行状态,让其结束。大家都知道,我们有三个线程,主线程结束了,它俩没结束,这个程序就结束不了。所以,必须要让所有的线程都结束,这个进程才能结束。不是所有线程都能结束的,系统的就结束不了。

package test5;
/**
 * 
 * @author 高小硕
*但是如果线程处于冻结状态,无法获取标记,如何结束呢?
*
*可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu的执行资格。
*
*当时强制动作会发生了InterruptedException,记得处理。
*
*/

class StopThread implements Runnable
{
	private boolean flag = true;
	@Override
	public synchronized void run()
	{
		while (flag) 
		{
			try 
			{
			wait();
			} 
			catch (InterruptedException e) 
			{
			// TODO: handle exception
			System.out.println(Thread.currentThread().getName()+"......"+e);
			flag = false;		
			}
			System.out.println(Thread.currentThread().getName()+".......++");
		}
		
	}
	
	public void setFlag() {
		flag = false;
		
	}
	
}
class StopThreadDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StopThread st = new StopThread();
		
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(st);
		
		t1.start();
//		t2.setDaemon(true);/守护线程
		//t2.start();
		
		t2.start();
		
		int num = 1;
		
		for (;;) {
			if (++num==50) 
			{
//				st.setFlag();
//				t1.interrupt();
//				t2.interrupt();
				break;
			}
			System.out.println("main"+num);
		}
		
		System.out.println("Over");
	}

}

参考后做了适当修改。http://www.cnblogs.com/wsw-bk/p/8097403.html

猜你喜欢

转载自blog.csdn.net/fighting_future/article/details/80397935