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多线程-wait(), notify(), notifyAll()、yield()、sleep()、join()、interrupt()原理及使用

参考:http://www.cnblogs.com/skywang12345/p/java_threads_category.html 一、线程等待与唤醒 1、wait(), notify(), ...
  • Love_JavaProgram
  • Love_JavaProgram
  • 2016年01月08日 19:54
  • 1448

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) (r)

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java并发编程系列: Java 并发编程:核心理论  Java并发编程:Synchron...
  • wangtaomtk
  • wangtaomtk
  • 2016年08月21日 11:48
  • 362

一目了然,Java线程各方法区别:sleep, yield, join, wait, notify

一.各方法定义: 1. staic void sleep(long millis), static void sleep(long millis, int nanos) 当前线程暂停,给予其...
  • Henry956595421
  • Henry956595421
  • 2017年05月05日 16:43
  • 148

sleep、yield、wait、join的区别

1.sleep:Thread类的方法,必须带一个时间参数。会让当前线程休眠并进入阻塞状态并释放CPU,提供其他线程运行的机会且不考虑优先级,但如果有同步锁则sleep不会释放锁即其他线程无法获得同步锁...
  • jarniyy
  • jarniyy
  • 2016年05月16日 23:20
  • 615

java线程的join,wait,notify深入理解

对于thread的理解,一直停留在基本层面,想着加强一下理解。Ok,问题总是有的,当然收获也是美滋滋的。 先从一下demo开始lz的探索之旅,一步步揭开那神秘的面纱。 public class J...
  • wjbtian
  • wjbtian
  • 2014年02月20日 11:56
  • 2035

wait 、notify 、join、yield

wait 和 notify 的例子 public class SimpleWN { final static Object object = new Object(); publ...
  • dingjianmin
  • dingjianmin
  • 2017年07月04日 22:21
  • 102

sleep(),wait(),yield()和join()方法的区别

sleep()   sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级...
  • xiangwanpeng
  • xiangwanpeng
  • 2017年02月10日 17:59
  • 1918

线程:sleep()、wait()、yield()和join()方法

        1.sleep()和wait()        这两个方法都可以让调用它的线程沉睡(sleep)/停止运行(wait)指定的时间,到了这个时间,线程就会自动醒来,变为可运行状态(RUN...
  • ForWayfarer
  • ForWayfarer
  • 2008年12月05日 20:59
  • 15133

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

前言 多线程一直是初学者最困惑的地方,每次看到一篇文章,觉得很有难度,就马上叉掉,不看了,我以前也是这样过来的。后来,我发现这样的态度不行,知难而退,永远进步不了。于是,我狠下心来看完别人的博客,尽...
  • qq_30379689
  • qq_30379689
  • 2016年12月27日 15:02
  • 3012

JVM:线程状态park, wait, sleep, interrupt, yeild 对比

转载自:http://www.cnblogs.com/23lalala/p/6214356.html ---恢复内容开始--- JVM线程状态 NEW, RUNNABLE, BLOCKED, W...
  • hwhua1986
  • hwhua1986
  • 2017年01月17日 15:48
  • 565
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wait and notify 例子(yield/join)
举报原因:
原因补充:

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