Java多线程-线程通信

线程通信三个方法
* wait();//一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
* notify();//一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就会唤醒优先级较高的
* notifyAll();//一旦执行此方法,就会唤醒被wait的所有线程
*
* 注意
* 1.wait\notify\notifyAll只能出现在同步代码块或者同步方法中
* 2.wait\notify\notifyAll的调用者必须是同步代码块或同步方法中的同步监视器

/**
 *
 * 线程通信的例子,使两个线程打印1-100,线程1,线程2交替打印
 * 线程通信三个方法
 * wait();//一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
 * notify();//一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就会唤醒优先级较高的
 * notifyAll();//一旦执行此方法,就会唤醒被wait的所有线程
 *
 * 注意
 * 1.wait\notify\notifyAll只能出现在同步代码块或者同步方法中
 * 2.wait\notify\notifyAll的调用者必须是同步代码块或同步方法中的同步监视器
 *
 *
 * * @author orz
 */
public class CommunicationTest {
    public static void main(String[] args) {
        Number number = new Number();
        Thread t1=new Thread(number);
        Thread t2=new Thread(number);

        t1.setName("线程一");
        t2.setName("线程二");

        t1.start();
        t2.start();

    }
}
class Number implements Runnable
{
    private int number=1;
    @Override
    public void run() {
        while (true)
        {
           synchronized (this)
           {
               //唤醒一个线程
               notify();
               if (number<=100)
               {
                   System.out.println(Thread.currentThread().getName()+":"+number);
                   number++;

                   try {
                       //使得线程进入阻塞状态,释放锁
                       wait();
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
               else
               {
                   break;
               }
           }

        }
    }
}

 

posted @ 2020-07-27 22:15  orz江小鱼  阅读(95)  评论(0编辑  收藏  举报