JAVA笔记(十二)-----线程间通信

线程间通信:其实就是多个线程在操作同一个资源,但操作的动作不同

notify():唤醒线程池中等待的线程

wait():线程等待,notiry唤醒(先等待先被唤醒)

notifyAll():唤醒线程池中松油等待线程

以上3个方法都使用在同步中,因为要对持有监视器(锁)的线程操作。

所以要使用在同步中,因为只有同步才具备监视器。

 

为什么这些操作线程的方法要定义在Object类中呢?

因为这些方法在操作同步中线程时,都必须要表示它们所操作线程才有的锁,只有同一个锁上的“被等待”线程,才可以被对应同一个锁上的notify唤醒。

不可以对不同锁中的线程进行唤醒。

锁可以是任意对象,而Object是所有类的超类,所以定义在Object类中就可以被任意对象使用。

使用案例:

class ThreadDemo1
{
     synchronized (obj)
   {
    if(flag == true)
      try{obj.wait();}catch(Exception e){}
    ..........
    ..........
    flag = true;
    notify();
   } }
class ThreadDemo2 {    synchronized(obj)
   {
     if(!flag)
        try{obj.wait();}catch(Exception e){}
     ........  
     ........
     flag = false;
     notify();
   }
}
因wait()方法定义中抛了异常但run方法中不可继续抛出异常,所以只能对异常进行内部try catch处理。

JDK1.5中提供多线程升级解决方案
将同步synchronized替换成显式Lock操作
将Object中的wait,notify,notifyAll替换成了Condition对象
该对象可以Lock锁进行获取。
示例
java.util.concurrent.locks

class Resource
{
  private Lock lock = new ReentrankLock();//看API文档
  private Condition condition_pro = new lock.newCondition();
  private Condition condition_con = new lock.newCondition();

  public void set(String name) throws InterruptedException
  {
    lock.lock();
    try
    {
      while(flag)
        condition_pro.await();
      this.name = name + “....” + count++;
      flag = true;
      condtion_con.signal();  
    }
    finally
    {
      lock.unlock();//一定要释放锁,否则造成死锁
    }
  }
}

该示例中,实现了本方只唤醒对方操作。

 

停止线程:

1.定义循环结束标记

  因为线程运行代码一般都是循环,只要控制了循环即可

2.使用interrupt()方法,中断线程

  该方法是结束线程的冻结状态,使线程回到运行中来

  注:stop方法已经过时不再使用

 

特殊情况:

当线程处于冻结状态,就不会读取到标记,那么该线程就不会结束

 

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

 

Thread类中提供了该方法 interrupt()方法;

join():当A线程执行到B线程的join()方法时,A线程就会等待,当B线程执行完后,A线程才恢复执行。

join()可以用来临时加入线程执行

yeild():临时释放执行权,为了让线程执行频率均匀。

 

posted @ 2016-03-23 10:52  追风少年阿远  阅读(49)  评论(0)    收藏  举报