七,对象的wait()、notify()和notifyAll()用法
1)Object
类定义了 wait()、notify() 和 notifyAll()
方法。可以让线程相互通知事件的发生。要执行这些方法,必须拥有相关对象的锁。
2)wait() 会让调用线程休眠,直到用
Thread.interrupt() 中断它、过了指定的时间、或者另一个线程用 notify() 或 notifyAll()
唤醒它。
3)当对某个对象调用 notify() 时,如果有任何线程正在通过 wait()
等待该对象,那么就会唤醒其中一个线程。当对某个对象调用 notifyAll()
时,会唤醒所有正在等待该对象的线程。
假如我们有两条线程,我们希望线程的输出顺序是:
线程t1输出十次
线程t2输出十次
线程t1输出十次
线程t2输出十次
那程序该如何实现?
我们的设计思路是:
使用锁的机制,首先,线程1进入可运行状态后
1)线程t1获取对象的锁
2)线程t1完成输出十个数的任务
3)唤醒其他(t2)正在等待的线程
4)自身阻塞,释放锁。
5)线程t2获取锁
6)线程t2完成输出十个数的任务
7)唤醒其他(t1)正在等待的线程
8)自身阻塞,释放锁。
9)。。。。
程序的实现如下:
程序代码
package zizz
;/**
* 主程序.
使用wait(),notify(),notifyAll()方法
*
* @author <a href='http://www.suneca.com'>ZIZZ</a>
*
*
@Create-Time:2008-4-21 上午12:51:59
*/public class ThreadLock
{ public static void main
(String
[] args
) { //共享线程实例的线程. ShareRunnable
share
= new ShareRunnable
(); Thread t1
= new Thread
(share
, "t1"); Thread t2
= new Thread
(share
, "t2"); t1
.start
(); t2
.start
(); }}/**
*
* @author <a href='http://www.suneca.com'>ZIZZ</a>
*
*
@Create-Time:2008 上午12:14:26
*/class ShareRunnable
implements Runnable
{ public void run
() { //第一个线程运行时,对共享的线程对象进行加锁 synchronized (this) { for (int i
= 1
; i
<= 100
; i
++) { //输出当前的值 System
.out
.println
(Thread
.currentThread
().getName
() + " : " + i
); // 如果i为10的倍数 if (i
% 10
== 0
) { try { //
唤起其他线程 notifyAll
(); //
当前正在运行的线程阻塞,释放拥有该对象的锁. if(i
== 100
)break; else wait
(); } catch (InterruptedException e
) { e
.printStackTrace
(); } } } } }}
运行结果片断:
假如在开发的时候,并没有写上
synchronized (this)
{...}的同步语句,那将会出现一些问题,因为使用wait()、notify(),它需要有
owner,假如没有写上这个同步语句块,那系统将会执出如下错误信息:
程序代码
Exception
in thread "t1" java.lang.IllegalMonitorStateException: current thread not owner
at
java.lang.Object.notifyAll(Native Method)
at
zizz.ShareRunnable.run(ThreadLock.java:41)
at
java.lang.Thread.run(Thread.java:595)
相关推荐
《Visual C# 2010从入门到精通:Step by Step》以深受读者欢迎的“动手练习”(learn-by-doing exercise)风格,演示了如何、何时以及为何使用C认#快速应用程序开发环境的特性。通过《Visual C# 2010从入门到精通:...
Step by StepLinux C多线程编程入门(基本API及多线程.pdf
Java线程循序渐进:概述 进程与线程 ################################################ ################################ 第1节-创建线程 ################################################ ####################...
3.1 JAVA中的多线程与线程安全 6 3.1.1 Java中的多线程 6 3.1.2 Java中的线程安全 7 3.2 HTTP协议简介 8 3.3 断点续传原理 8 4 需求分析 10 4.1用户需求分析 10 4.2 业务流分析 11 5. 整体设计 11 5.1 系统...
how to use my jar to download images Demo,just use about 4 line code to compete download image fastest and your application will run smoothly // download image in normal not fit Adapter Mode // step...
摘要:Delphi源码,系统相关,线程实例 压缩包内含有两个示例,用于演示如何实现一个Delphi第三访的MainThreadWake...如果在该程序中,iMax值足够大,且step值足够小(或随机),那么就很容易导致控制台的争用(冲突)。
II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 ...
多线程 求质数 返回数组中的最大值 bool isPrime(long x) { if (x ) return false; if (x == 2) return true; for (long i = 2; i (sqrt((long double)x));i++) if (x%i == 0) return false; return true; } ...
先写一段多线程程序。 makefile 加上 -g参数生成可调式信息, 可以进行调试。 pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。在gcc编译的时候,...
原书名: Microsoft Visual C# 2010 Step by Step 原出版社: Microsoft Press 作者: (英)John Sharp 译者: 周靖 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302234289 上架时间:2010-9-6 ...
} } <br>答案::填空第1题 x=10,a=3,b=4,c=5 填空第2题 java.util 填空第3题 (public )(static )(void)(main)(String args[]) 填空第4题 1 填空第5题
探索多线程,异步,功能和React式编程 向您的应用程序添加用户友好的图形界面 找出什么是流以及它们如何在数据处理中提供帮助 了解微服务的重要性,并利用它们使您的应用程序健壮和可扩展 探索Java设计模式和最佳...
3、由于每条鱼的行为不一样,所以要继承线程类,实现并发——屏幕上有多条鱼各自移动。鱼池继承JPannel,并引入自己的新的属性:鱼和鱼池。 4、类的详细设计: ``` 各个属性的说明如下: - step:鱼的移动速度 - ...
step_mun: Integer; max_mun: Integer; FProgressBar: TProgressBar; FLabel: TLabel; procedure DoProgress; protected procedure Execute; override; public constructor Create(CreateSuspended: ...
步骤守护程序 Step Daemon(步进式)是用于3d打印机的外部计划程序,该计划... 多线程管道。 双立方床水准仪具有每步精度(相对于每行)。 兼容OctoPrint。 与对Marlin的直接步进块支持一起开发。 适用于Linux(包
//查看所有线程: ~* 查看线程1的栈: ~1 查看线程所有信息包括堆栈: ~* -a //查看进程内存属性 lmm //查看句柄!handle 查看h1 !handle h1 , !handle rcx //查看窗口lwd //resume线程 ~1 m resume all线程: ~* m //...
PageRank 算法的 C 实现,有和没有并行化 包括几个文件: ...自定义调度类型(静态、动态)和线程数; step2mmap.c ,与step2.c相同,但使用 mmap; step3mmap.c ,与step3.c相同,但使用 mmap。
其中LocalPlayer作为AIPlayer和HumanPlayer的装饰器,在内部保存这两个类之一的一个引用,在自身的singleStep方法中,调用被装饰类对象的singleStep方法,并添加向远程发送信息的装饰代码。 4. 设置棋盘不能够接受...
GDB详细手册,文档内部分内容: //查看运行中的线程 (gdb) info thread //查看线程 (gdb) thread <n> //切换为线程...(gdb) set scheduler-locking off|on|step //只有当前函数,当前线程执行 完整版本请下载该手册!