当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
Java多线程的wait()和notify()例子
发布时间:2010/10/29 10:41:16 来源:城市学习网 编辑:ziteng
  示例代码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();
  }
  }
  } [NextPage]   示例代码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();
  }
  }
  }
  }
  }
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved