package
org.eleaf.j2se.th;
import
java.io.PrintStream;
public
class
ThreadTest2 {
public
static
void
main(String[] args) {
Tt2Wc tw =
new
Tt2Wc();
Tt2Cook tc =
new
Tt2Cook(tw);
Tt2Sweep ts =
new
Tt2Sweep(tw);
Thread t1 =
new
Thread(tc, tc.
name
);
Thread t2 =
new
Thread(ts, ts.
name
);
t1.start();
t2.start();
}
}
//
卫生间
class
Tt2Wc {
//
假设做饭和打扫卫生都要用到卫生间的水。
boolean
isWaterOpened
=
false
;
//
使用卫生间
public
void
useWc(
int
sc)
throws
InterruptedException {
Thread t = Thread.currentThread
();
//
这段代码使得两个线程在控制台打印信息的颜色不同。其中
“
打扫者
”
打印信息显示为红色。
PrintStream pw =
null
;
if
(
"
打扫者
"
.equals(t.getName())){
pw = System.
err
;
}
else
{
pw = System.
out
;
}
//
如果卫生间的水已经有人在用,就在门外等待。
if
(
isWaterOpened
){
pw.println(Thread.currentThread
().getName() +
"
在卫生间外面等候
"
);
synchronized
(
this
) {
wait();
}
}
synchronized
(
this
) {
changeWaterState();
pw.println(t.getName() +
"
现在使用卫生间
.
持续
"
+ sc/1000 +
"
秒
"
);
//
用
sleep()
方法来简化使用卫生间的过程。
Thread.sleep
(sc);
pw.println(t.getName() +
"
使用卫生间结束
."
);
changeWaterState();
//
通知在门外等待的人可以进来用水了。
notify();
}
}
private
void
changeWaterState() {
isWaterOpened
= !
isWaterOpened
;
//
System.out.println("water state:" + isWaterOpened);
}
}
//
做饭
class
Tt2Cook
implements
Runnable {
private
Tt2Wc
tw
;
public
String
name
=
"
做饭者
"
;
public
Tt2Cook(Tt2Wc tw){
this
.
tw
= tw;
}
public
void
run(){
try
{
System.
out
.println(
name
+
"
开始了
..."
);
//
使用卫生间
tw
.useWc(10000);
System.
out
.println(
name
+
"
去忙别的事了
++++++."
);
tw
.useWc(12000);
System.
out
.println(
name
+
"
去忙别的事了
++++++."
);
tw
.useWc(11000);
System.
out
.println(
name
+
"
去忙别的事了
++++++."
);
tw
.useWc(11000);
System.
out
.println(
name
+
"
关闭
."
);
}
catch
(InterruptedException ie){
ie.printStackTrace();
}
}
}
//
打扫卫生
class
Tt2Sweep
implements
Runnable {
public
String
name
=
"
打扫者
"
;
private
Tt2Wc
tw
;
public
Tt2Sweep(Tt2Wc tw){
this
.
tw
= tw;
}
public
void
run() {
try
{
//
打扫者信息显示为红色
//
System.
err
.println(
name
+
"
开始了
..."
);
//
使用卫生间
tw
.useWc(10000);
System.
err
.println(
name
+
"
去忙别的事了
++++++."
);
tw
.useWc(10000);
System.
err
.println(
name
+
"
去忙别的事了
++++++."
);
tw
.useWc(10000);
System.
err
|
相关推荐
wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...
使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
12.4.3 wait和notify方法320 12.4.4 死锁322 12.5 集合类的同步问题323 12.5.1 使用synchronized同步块324 12.5.2 使用集合工具类同步化集合类对象324 12.5.3 使用JDK5.0后提供的并发集合类324 12.6 用Timer类调度...
12.2.2 认识接口的代码组成 340 12.2.3 什么是接口 341 12.2.4 使用接口仅需一步——实现接口 342 12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 ...
12.2.2 认识接口的代码组成 340 12.2.3 什么是接口 341 12.2.4 使用接口仅需一步——实现接口 342 12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 ...
wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? ...
│ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...
│ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...