- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章基于线程的wait和notify使用,生产消费案例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
多个线程可以相互竞争,也可以互相协作完成一件事情.
Object的相关方法 。
Object相关方法 | 描述 |
---|---|
void wait() | 让当前线程等待,如果没有被唤醒,就一直等待 |
void wait(long timeout) | 让当前线程等待指定毫秒值,如果到了指定的毫秒值自动唤醒 |
void notify() | 唤醒一个线程,唤醒的是当前对象锁下的一个线程 |
void notifyAll() | 唤醒所有线程,唤醒的是当前对象锁下面的所有线程 |
这些方法一定要放在同步代码块中去使用,并且这些方法要通过锁对象去调用【***】 。
案例:
生产方每生产一个产品就需要等待(通知)消费方消费完产品后才能继续生产 。
消费方每消费一个产品就需要等待(通知)生产方去生产产品后才能继续消费.
【注意】 。
notify、wait写在同步代码块中,并且使用同一个对象(共有对象:仓库)进行操作.
this.cangku.wait() 和this.wait() 前一个使用的是仓库对象 ,后一个使用的是当前任务对象(使用后一个会造成死锁) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
//仓库 - 唯一(锁对象,任何对象都可以,用共有对象做锁对象)
class
CangKu {
//当作 锁对象
//定义一个变量体现数量
public
int
productNum =
0
;
}
//生产方和消费方共用一个仓库
//生产方
class
ProductTask
implements
Runnable {
private
CangKu cangKu;
//共用一个仓库不能自己创建,由外部传入
public
ProductTask(CangKu cangKu) {
//通过构造函数初始化
this
.cangKu = cangKu;
}
@Override
public
void
run() {
while
(
true
) {
//通知notify与等待wait必须写在同步代码块中
synchronized
(
this
.cangKu) {
//判断是否有锁可用,有就进入
if
(
this
.cangKu.productNum ==
0
) {
++
this
.cangKu.productNum;
//生产数目+1
System.out.println(
"生产了一个产品,当前产品数目:"
+
this
.cangKu.productNum);
//通知消费者,必须用同一个锁对象,不然会造成死锁
this
.cangKu.notify();
}
else
{
//当前还有存货不用生产,等待通知
try
{
System.out.println(
"生产方等待中..."
);
this
.cangKu.wait();
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
//end if
}
//end synchronized 出房间释放锁
}
}
}
//消费方
class
ConsumerTask
implements
Runnable {
private
CangKu cangKu;
public
ConsumerTask(CangKu cangKu) {
//构造方法
this
.cangKu = cangKu;
}
@Override
public
void
run() {
while
(
true
) {
synchronized
(
this
.cangKu) {
//判断,仓库是否为0
if
(
this
.cangKu.productNum ==
0
) {
try
{
System.out.println(
"消费方等待中..."
);
this
.cangKu.wait();
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
else
{
//有货可以吃
--
this
.cangKu.productNum ;
System.out.println(
"消费了一个产品,当前产品数目:"
+
this
.cangKu.productNum);
//通知生产方生产产品
this
.cangKu.notify();
}
//end if
}
//end synchronized
}
}
}
public
class
Wait_Notify_Demo {
public
static
void
main(String[] args) {
//任务对象(生产方和消费方共用一个仓库)
CangKu cangKu =
new
CangKu();
ProductTask productTask =
new
ProductTask(cangKu);
ConsumerTask consumerTask =
new
ConsumerTask(cangKu);
//定义线程(用Executors线程池)
ExecutorService pool = Executors.newFixedThreadPool(
2
);
pool.submit(productTask);
//生产
pool.submit(consumerTask);
//消费
}
}
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://striveday.blog.csdn.net/article/details/109810336 。
最后此篇关于基于线程的wait和notify使用,生产消费案例的文章就讲到这里了,如果你想了解更多关于基于线程的wait和notify使用,生产消费案例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试在我安装的 Laravel 5.1 中设置 Gulp。我已经运行然后命令 npm install正如 Laravel 文档中所指定的那样,效果很好。 但是,当我现在运行命令时 gulp我收到
我有两个扩展线程的类和一个等待/通知 class A extends Thread { int r = 20; public void run() { try {
我正在尝试在后台服务中启动通知,这也是位置监听器。我有一个功能: public Notification CreateNotification(){ Intent notificati
编辑:我将其范围缩小到 python 代码中 Notifier.notify('Something') 的问题。当 python 脚本从 launchd 启动时,这不会产生预期的行为。我的其他 pyt
我正在尝试使用 bootstrap-notify v3.1.3、typescript、aurelia 和 VS2015 在我的网站上显示警报。 我的 aurelia 组件是: //myAlert.ts
注:other question的标题不同,导致无法识别为匹配的。 系统.类 TCollection = class(TPersistent) protected procedure Notify
我正在将一个项目从 Sprockets 迁移到 Webpacker。 我似乎无法正确运行的最后一件事是通知。 我曾经能够做到:$.notify('Test') 但现在我得到了 Uncaught Typ
我在一个项目中有多个用户控件,其中一个从 XML 中检索项目,创建“ClassItem”类型的对象,并应通知其他用户控件有关这些项目的信息。 我为我的对象创建了一个类(所有项目都将具有的“模型”):
我以为我会理解 Java 中的并发概念,但现在有一件事打破了我的理解: 为什么我必须在同步块(synchronized block)中包含对 wait() 和 notify() 方法的调用? 假设我有
我正在开发 NodeJS/Electron/Angular 应用程序,我正在使用 node-notifier 模块。一切正常,但在我的通知消息底部有一个不合适的“toast”字符串。它仅在我使用“图标
我正在基于Sproutcore 1.9.1的Web应用程序上工作。要从服务器检索数据 发出一个SC.Request.getUrl()请求,该请求在除IE8之外的所有浏览器中都可以正常工作。 对于IE8
我试图写一个关于如何使用wait()和notify()的示例,但是似乎无法通知wait() public class Transfer { private int[] data; pr
我想使用QAudioInput从麦克风捕获声音,对其进行处理然后再播放。据我了解,我需要连接到notify信号和内部处理程序,以便用户使用readAll()函数来获取原始数据。但是问题是,此处理函数永
public class Signal2NoiseRatio { public ImagePlus SingleSNR(ImagePlus imagePlus) throws Interrup
为什么只有第一个任务退出后才调用dispatchGroup.notify? 下面的代码输出如下: 1) Did the other thing **2) Did all the things** 3)
假设线程 T1 正在等待进入同步块(synchronized block),线程 T2 在同步块(synchronized block)内 wait(),并且线程 T3 在同步块(synchroniz
我正在尝试仅使用等待/通知同步来实现合并排序。我知道更高级的结构,例如 Fork/Join、Executors。等等,但我需要在这里使用工作/通知。基于此https://courses.cs.wash
了解 notifyAll 让我对 notify 产生了一些疑问:在典型情况下,我们有多个线程正在等待对 methody notify 的调用。当这种情况发生时,其中一个线程(之前调用了 wait 方法
我正在使用 wait() 和 notify() 编写一个示例程序,但是当调用 notify() 时,会出现多个线程被唤醒而不是一个。 代码是: public class MyQueue { O
根据17.2.4. Interactions of Waits, Notification, and Interruption : Similarly, notifications cannot be
我是一名优秀的程序员,十分优秀!