wait and notify 例子(yield/join)

原创 2012年03月22日 19:03:32

package test;

public class ThreadTest {
 
 private Object lock = new Object();
 
 private int i = 0;

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  ThreadTest threadTest = new ThreadTest();
  Thread1 th1 = threadTest.new Thread1();
  Thread2 th2 =  threadTest.new Thread2(th1);
  th1.start();
  th2.start();
 }
 
  private class Thread1 extends Thread{

    @Override
    public void run() {
     while (true) {
      synchronized (lock) {
            try {
        if (i > 10 && i < 20) {
         lock.wait();//如果只有wait(),则默认调用this.wait(),实际上并未获得this的锁,所以会报错IllegalMonitorStateException

         //yield();
        }

        System.out.println("Thread1:" +(++i));

        Thread.sleep(1000);
       } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
     }
    }
   
   }

 
 private class Thread2 extends Thread {
  private Thread1 preThread;
  public Thread2(Thread1 thread){
   this.preThread=thread;
  }
  @Override
  public void run() {
   while (true) {
    synchronized (lock) {
     
     System.out.println("Thread2:" +(++i));
     try {
      preThread.join();
      if (i > 20) {
       lock.notify();
       lock.wait();
      }
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
  }
  
 }

}


 

自己并不拥有的对象,java.lang.IllegalMonitorStateException

java.lang.IllegalMonitorStateException
违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
这是网上的解释,我不是很明白,什么叫“自己并不拥有的对象”,我是在一个对象调用wait();在另一个对象调用notifyAll()

------解决方法--------------------------------------------------------
如果不正确地管理wait/notify调用,应用程序可能会抛出IllegalMonitorStateException,例如,若不拥有对象的锁标记,而试图用wait/notify协调共享对象资源,应用程序将抛出IllegalMonitorStateException。

IllegalMonitorStateException意味着一个或多个资源可能不再处于一致状态,表示程序出现了严重问题。由于IllegalMonitorStateException是RuntimeException类型,因此它可能中断产生异常的线程。

 

相关文章推荐

Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别

Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别  从操作...

Java多线程示例(模拟通话,sleep,join,yield,wait,notify,Semaphore)

主线程等待子线程的多种方法 synchronized浅析 sleep 是静态方法,Thread.sleep(xx)谁调用谁睡眠。 join 是合并方法,当前线程调用其他线程xx.join()则等...

Android 价值千万的java线程专题:Wait&notify&join&Yield

创建线程的2种方式 1.实现Runnable接口的多线程例子 2.测试扩展Thread类实现的多线程程序   Thread有setName("MyThread");Runnable没有 clas...

深入剖析Sleep、wait、notify、notifyAll、yield、join、Interrupt

sleep原理sleep是Thread类中的静态方法,首先看下sleep的源码/** * Causes the currently executing thread to sleep (te...

线程间协作:wait,notify,notifyAll,join,yield

wait1.wait,notify,notifyAll是Object类的方法。在使用时必须包含在synchronized方法中或者同步块中。即必须先获得正确的对象锁,调用wait后,会释放自己占有的锁...

sleep、join、yield、wait、notify、notifyAll、run、start、synchronized

1、sleep()      使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共...

Java 线程间的协作(wait/notify/sleep/yield/join)

今天说说这个看了很多遍,又忘了很多遍的知识点:Java线程间的协作。

Java并发——线程间协作(wait、notify、sleep、yield、join)

1线程的状态Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)...

Android进阶——多线程系列之wait、notify、sleep、join、yield、synchronized关键字、ReentrantLock锁

多线程系列之线程的wait、Sleep、join、yield、synchronized关键字、ReentrantLock锁

java Thread sleep yield join wait notify notifyAll

记录一下: Thread States A thread can be only in one of five states (see Figure 9-2): New : ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wait and notify 例子(yield/join)
举报原因:
原因补充:

(最多只允许输入30个字)