点击这里给我发消息 点击这里给我发消息

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

添加时间:2013-12-7
    相关阅读: 相关内容

  示例代码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();

  //使用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();

  }

  }

  }

  }

  }

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册