`

(转)线程wait的例子

    博客分类:
  • java
 
阅读更多
Java代码 复制代码 收藏代码
 public static void main(String[] args) throws Exception {
		final Object lock="";
		Thread t1=new Thread(){
			public void run(){
				try {
					System.out.println("t1 wait begin");
					synchronized (lock) {
						lock.wait();
					}
					System.out.println("t1  wait end");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		
		t1.start();
		Thread.sleep(5000);
		
        System.out.println("main lock begin");
		synchronized (lock) {
			lock.notify();
			Thread.sleep(10000);
			System.out.println("main wait begin ");
			lock.wait();
			System.out.println("main wait end");
		}
		System.out.println("main lock end");
		t1.join();
		System.out.println("process exist");
	 
	}

 输出:

 

Java代码 复制代码 收藏代码
t1 wait begin
main lock begin
main wait begin 
t1  wait end

 

描述:

        线程t1获取lock对象的监视器后,马上调用lock的wait方法,放弃了lock的监视器,

        主线程获取lock对象的监视器后,调用lock的notify方法唤醒等待lock的监视器的线程(这里是t1)

        之后睡眠10秒,然后调用lock的wait方法放弃lock的监视器。

 

结论:

1、wait,notify,notifyAll必须在当前线程获得监视器时才能调用,即这些方法必须在同步块中才能调用

2、t1线程,wait方法执行时,t1线程放弃lock对象的监视器,t1线程阻塞,导致同步块代码未执行完。

3、主线程中notify方法执行时,主线程唤醒在等待lock对象监视器的线程(随机的,t1线程只是被标记为可获取监视            器,但实际未获取,详情请看4),另外此方法并不阻塞而是立即返回。

4、主线程notify方法执行后,主线程仍然具有lock对象的监视器,而t1线程仍处于阻塞状态(虽然已经被主线程notify          了), 这点可以看代码,主线程睡眠10秒,而t1线程仍阻塞。只有当主线程调用wait方法,放弃lock的监视器后,

     t1线程才真正获得监视器,接着主线程阻塞,而t1线程继续执行同步块中未执行的代码

5、因没有任何线程调用notify方法呼唤主线程了,所以主线程一直阻塞

分享到:
评论

相关推荐

    一个理解wait()与notify()的例子

    一个理解wait()与notify()的例子,让你更好理解.

    多线程例子

    if(rc==WAIT_TIMEOUT) { //强行退出工作线程 DWORD exitCode; ::GetExitCodeThread(m_hThread, &exitCode;); if ( exitCode==STILL_ACTIVE ) { try { TerminateThread(m_hThread, 0x03); CloseHandle(m_...

    java 多线程设计模式 进程详解

    第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 何时调度是重要的 调度和线程优先级 ...

    java线程分析java project例子

    java线程分析java project例子,里面分析了sleep(),join(),yield()和wait以及notify等方法的使用以及需要注意的地方。

    epoll+多线程代码

    epoll+多线程的例子,本例子还有压力测试。

    JAVA多线程编程详解-详细操作例子

    本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...

    java线程分析android project例子

    java线程分析android project例子,主要分析了sleep(),join(),yield()和wait()以及notify等方法以及需要注意的事项。

    iOS多线程GCD和线程锁的使用

    iOS多线程编程之Grand Central Dispatch(GCD)使用,卖票的例子来讲NSThread的线程同步,使用了两种锁,一种NSCondition ,一种是:NSLock,还有加了一个 线程3 去唤醒其他两个线程锁中的wait,里面的注释很已经写的...

    Java多线程管理示例

    里面提供Java多线程的概念,同步,死锁,wait/nofity机制的示例《生产者与消费者》例子

    如何在Java中正确使用 wait, notify 和 notifyAll

    举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,...

    linux系统编程之线程.zip

    attr参数表示线程属性,本节不深入讨论线程属性,所有代码例子都传NULL给attr参数,表示线程属性取缺省值,感兴趣的读者可以参考APUE。 【练习】:创建一个新线程,打印线程ID。注意:链接线程库 -lpthread ...

    Delphi多线程编程之三 同步读写全局数据

    WAIT_ABANDONED 指定的对象是互斥对象,并且拥有这个互斥对象的线程在没有释放此对象之前就已终止。此时就称互斥对象被抛弃。这种情况下,这个互斥对象归当前线程所有,并把它设为非发信号状态 WAIT_OBJECT_0 指定...

    UNIX 多线程多进程编程

    主要根据本人在UNIX系统上的编程实践经验总结而成, 既做为自己在 一个时期内编程实践的部分...例子:/*父进程*/ if (fork()>0) { wait((int *)0); /*父进程等待子进程的返回*/ } else { /*子进程处理过程*/ exit(0); }

    MsgWaitForMultipleObjects函数的一种用法

    工程是VS2010,具体描述了如何在主线程中用MsgWaitForMultipleObjects等待子线程结束的同时,处理子线程发送的界面消息。

    Protothreads - 非常适合单片机上使用多线程方案,纯C语言实现,没有任何依赖!

    example-small.c 简单用法展示:两个线程之间互相等待的例子 example-buffer.c 经典问题:生产者、消费者问题 example-codelock.c 一个模拟用户输入密码的例子,还有定时器的用法展示 Main features: * No ...

    线程同步器CycliBarrier你都不会吗?

    两个例子CycliBarrier类图源码分析初始化await方法dowait方法参考文章 线程同步器CycliBarrier你都不会吗,打击到了我。 上文介绍了CountDownLatch,CountDownLatch虽然可以实现多个线程同步,但是只能使用一次。而...

    进销存系统文档作业例子

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、...

    CoreJava面试题汇总.html

    throwable error,说一下什么叫error,什么叫非运行时异常,举例子说明 7 线程的实现方式 8 什么叫线程安全 9 怎么处理异常? 10 int和integer的区别? 11 多态实现的机制 12 wait sleep的区别? 13 start run区别?

    java中的Lock类和Condition类.docx

    之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。...

    marl:用C ++ 11编写的混合线程光纤任务计划程序

    马尔 Marl是用C ++ 11编写的混合线程/光纤任务调度程序。 关于 Marl是一个C ++ 11库,它提供了一个流畅的界面,可用于跨多个线程运行任务。...# include " marl/waitgroup.h " # include < cstdio

Global site tag (gtag.js) - Google Analytics