Java多线程的wait()和notify()例子

来源:互联网 发布:苹果删不掉windows系统 编辑:程序博客网 时间:2024/05/18 06:18

示例代码1:

  package com.pinfo.test;

  public class ThreadTest {

  /**

  * @param args

  */

  public static void main(String[] args) {

  String lock = "lock";

  MyThread myThread = new MyThread(lock);

  Thread t1 = new Thread(myThread);

  t1.start();

  try {

  //确保线程t1先执行

  Thread.sleep(2000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  SubThread sub = new SubThread(lock);

  Thread t2 = new Thread(sub);

  t2.start();

  }

  }

  class MyThread implements Runnable{

  String lock;

  public MyThread(String lock){

  this.lock = lock;

  }

  public void run(){

  int i = 0;

  //使用lock对象作为监视器

  synchronized(lock){

  while(i++<20){

  try {

  //每次暂停500毫秒是为了更好地看到效果

  Thread.sleep(500);

  System.out.println("The first thread.-->"+i);

  if(i==10){

  //调用lock监视器的wait()方法,通知本线程释放监视器,本线程等待

  //其他也使用lock对象作为监视器的线程唤醒的时候,本线程得以继续运行

  lock.wait();

  //下面的wait(long timeout)表示:若等待5秒后还没有别的线程来唤醒的话,则本线程继续执行

  //lock.wait(5000);

  }

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }

  class SubThread implements Runnable{

  String lock;

  public SubThread(String lock){

  this.lock = lock;

  }

  public void run(){

  int i = 0;

  //这个线程也使用lock对象作为监视器

  synchronized(lock){

  while(i<10){

  i++;

  try {

  Thread.sleep(500);

  System.out.println("The second thread.-->"+i);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  //调用lock对象的notify()方法,唤醒同一对象监视器中调用wait的第一线程

  //或者调用notifyAll()方法,唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行

  lock.notify();

  }

  }

  }

示例代码2:

  package com.pinfo.test;

  public class ThreadTest {

  /**

  * @param args

  */

  public static void main(String[] args) {

  MyThread myThread = new MyThread(www.37meishi.com);

  //使用Runnable实现类创建线程

  Thread t1 = new Thread(myThread);

  //启动线程

  t1.start();

  try {

  //确保线程t1先执行

  Thread.sleep(2000);

  } catch (InterruptedException e1) {

  e1.printStackTrace();

  }

  int i = 0;

  //主线程使用myThread对象作为监视器

  synchronized(myThread){

  while(++i<=10){

  try {

  Thread.sleep(500);

  System.out.println("The main thread.-->"+i);

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  //调用监视器的notify()方法唤醒t1线程

  myThread.notify();

  }

  }

  }

  class MyThread implements Runnable{

  public void run(){

  int i = 0;

  //使用对象本身this作为监视器(与主线程的监视器为同一个对象)

  synchronized(this){

  while(i++<20){

  try {

  Thread.sleep(500);

  System.out.println("The sub thread.-->"+i);

  if(i==10){

  //释放监视器锁,阻塞等待...

  this.wait();

  }

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }


0 0
原创粉丝点击