黑马程序员---多线程interrupt方法和wait notify方法(原创)

来源:互联网 发布:什么是犀牛软件 编辑:程序博客网 时间:2024/05/16 09:31
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

/*
stop方法已经过时。

如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。

只要控制住循环,就可以让run方法结束,也就是线程结束。


特殊情况:
当线程处于了冻结状态。
就不会读取到标记。那么线程就不会结束。

当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。

Thread类提供该方法 interrupt();

 

*/


package FirstTest;

public class NewThread {
 public static void main(String args[])
 {
  Number n = new Number();
  Thread t1 = new Thread (n);
  Thread t2 = new Thread(n);
  
  t1.start();
  t2.start();
  
  int x = 0;//下面是主线程上的代码,主线程定义一个变量x = 0
  while(true)//无限循环
  {
   if(x++ == 60)//如果变量递增到60以后
   {
    break;//break;
   }
    n.changeFlag();//改变资源的flag标记,如此以来两个线程全部都挂到wait方法上(也就是让两个线程处于冻结状态),好测试interrupt方法
    t1.interrupt();//当线程1处于冻结状态后,线程挂起来了,调用Interrupt方法即强制恢复线程至正常状态,wait方法会报异常,然后在catch块(异常发生时要做的事情)中改变标记(flag)以结束线程
    t2.interrupt();
   System.out.println(Thread.currentThread().getName()+"......."+x);
  }
  System.out.println("over");
 }
}


class Number implements Runnable //给出一个run方法,让两个线程同时分享资源
{
 private boolean flag = false; //标记就是为了之后改变循环状态。改变标记使得两个线程冻结----用interrupt方法把冻结状态的线程恢复过来,然后在在67行把标记改为false,标记已改线程就处于停止状态
 public synchronized  void run()
 {
  while(flag)
  {
   try {
    wait();
    }
   catch (InterruptedException e)
    {
    System.out.println("exception");
    flag = false;
    }
   
   System.out.println(Thread.currentThread().getName()+"......test");
 
  }
 }
 
 
 
 
 public void changeFlag()
 {
  flag = true;
 }
}


/*
main.......1
main.......2
main.......3
main.......4
main.......5
main.......6
main.......7
main.......8
main.......9
main.......10
main.......11
main.......12
main.......13
main.......14
main.......15
main.......16
main.......17
main.......18
main.......19
main.......20
main.......21
main.......22
main.......23
main.......24
main.......25
main.......26
main.......27
main.......28
main.......29
main.......30
main.......31
main.......32
main.......33
main.......34
main.......35
main.......36
main.......37
main.......38
main.......39
main.......40
main.......41
main.......42
main.......43
main.......44
main.......45
main.......46
main.......47
main.......48
main.......49
main.......50
main.......51
main.......52
main.......53
main.......54
main.......55
main.......56
main.......57
main.......58
main.......59
main.......60
over
exception
Thread-0......test
exception
Thread-1......test

 

 

*/

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
原创粉丝点击