Joining a thread 等另一个线程执行完(die)
来源:互联网 发布:单片机连接马达 编辑:程序博客网 时间:2024/06/02 21:51
join:因为是连接,所以需要两个线程,
一、简单功能介绍
1、 正在干活的线程,你想和谁连啊(即对方线程):正在干活方表示这活干不下去了,一定要等别人全部干完才能干。
方法: 调用对方.join()
2、例子:比如正在洗衣服(正在执行线程),这时楼下水管破了,只能自来水公司的人修好水管(对方线程)
即:自来水公司.join()
3、sleepy1.join:正在执行的线程让出Cpu,进入阻塞队里,反正等待sleepy1执行完(即die),才能执行,至于slppy1什么时候能进入Cpu,由调度程序去控制,
sleepy1.interrupt():表示线程都是自然醒,哪么sleepy1线程设置了中断标志,sleepy1进入Cpu执行,但是执行后面的catch 指令,所以Sleepy1线程退出Cpu,表示自己已经die,
两个线程:1个设置中断标志,1个没有,哪么自然睡醒后,全部进入就绪队列,可以入Cpu。
唯一区分:1>就是设置中断标志的线程,直接执行异常处理,退出Cpu
2>未设置中断标志的线程,继续方法里后面的指令。
}
二、例子:文字描述
1、两个睡觉线程,sleep1,sleep2
2、两个连接线程和睡觉线程相连 join1 连 sleep1,join2 连 sleep2
sleep1 睡到自然醒,设置中断标志
sleep2 睡到自然醒,没有设置中断
3、所以本程序有5个线程。
main()线程+sleep1,sleep2,join1,join2 4个线程。
4、执行:先执行main 下面的两个线程,由于这两个程序在new 时调用.start()方法,所以sleep1,2 两线程进入就绪队列。
这俩线程谁先谁后,由调度程序决定,下面例子是sleep1先执行,如果你重新执行一篇,有可能是sleep2或join1()先执行
这个例子主要保证join1,join2 执行顺序,其它线程可先可后。
1》 本例子:main 退出 Cpu,进入就绪队列
2》cpu空,调度程序选择sleep1先占Cpu,----,sleep(1500)-------进入阻塞队列
3》cpu空,调度程序选sleep2占Cpu,----sleep(1500)-----进入阻塞队列
4》cpu空,就绪队列只剩下main()了,-----执行Main()的一条指令,new 时已经调用.start(),-----join1,join2 进入就绪队列
5》main 退出 Cpu,进入就绪队列.
6》cpu空,join1进入cpu,执行 sleep1.join() :表示一定要等到sleep1执行完了且sleep1线程死亡后,我才能执行。
join1----进入阻塞队列
7》cpu空,调度程序选中Main()进入内存,执行sleepy1.interrupt(),标志sleepy1线程中断,且die
8》这时main线程已经没有指令了,cpu空
就绪队列只剩下join2 ()了
这时sleepy1 已经睡醒,进入就绪队列,调度程序选sleepy1入cpu,因为已经设置中断标志,因此直接执行catch后面的语句,这时
sleepy1 死亡。
9》cpu 空。就绪队列只剩下join2 ()了
直接进入Cpu执行:当执行到 sleep2.join() ,需要sleep2干完活自己才能继续干活,----join2 进入阻塞队列
10》cpu空,调度程序调度 阻塞队列的join1()进入就绪队列
就绪队列只剩下join1 ()了,join1线程入cpu,执行,join1执行完。
11》cpu空,就绪队列空
sleepy2已经睡醒: 入就绪队,进cpu执行,由于没中断标志,直接执行未执行完的指令
12》cpu空,就绪队列空,阻塞队列剩下 join2
join2进入就绪队,进cpu执行。
***整个执行完成。
三、例子:图形描述
四、代码 java think上的代码
package concurrency;
import static net.mindview.util.Print.*;
class Sleeper extends Thread {
private int duration;
public Sleeper(String name, int sleepTime) {
super(name);
duration = sleepTime;
start();
}
public void run() {
print(getName() + " run");
try {
sleep(duration);
} catch (InterruptedException e) {
print(getName() + " was interrupted. " + "isInterrupted(): "
+ isInterrupted());
return;
}
print(getName() + " has awakened");
}
}
class Joiner extends Thread {
private Sleeper sleeper;
public Joiner(String name, Sleeper sleeper) {
super(name);
this.sleeper = sleeper;
start();
}
public void run() {
print(getName() + " join");
try {
sleeper.join();
} catch (InterruptedException e) {
print("Interrupted");
}
print(getName() + " join completed");
}
}
public class Joining {
public static void main(String[] args) {
Sleeper sleepy1 = new Sleeper("Sleepy1", 1500),
sleepy2 = new Sleeper("Sleepy2", 1500);
Joiner joinsleepy1 = new Joiner("Join1", sleepy1),
joinsleepy2 = new Joiner("Join2", sleepy2);
sleepy1.interrupt();
}
}
五、总结:发现线程只要是在.start()状态,总有机会进入Cpu,就算标志中断了,也会去cpu执行对应的异常代码。
- Joining a thread 等另一个线程执行完(die)
- Joining a Tour
- thread 线程执行顺序
- 线程执行的顺序 等线程执行完再执行下一个线程
- 等子线程Thread执行完之后再执行mian线程的UI更新等等
- java中一个线程等待另一个线程执行完后再执行
- 线程执行 Q&A
- Python 线程条件(Condition),(线程等待另一个线程的执行)
- 1.2.2合并线程(Joining Threads)
- New Blog after joining a new company!
- A. Die Roll
- A. Die Roll
- 9A - Die Roll
- 线程Thread join 方法---优先执行
- Thread执行控制和线程死锁
- 如何等一个线程执行完执行另外一个线程,借助FutureTask类
- NSViewAnimation选项NSAnimationNonblockingThreaded把动画放到另一个线程中执行
- CF 9A. Die Roll
- 第37课 : Task执行内幕与结果处理解密
- BZOJ 3924: [Zjoi2015]幻想乡战略游戏
- 3Sum Closest
- 无法打开mfc120.lib
- 572. Subtree of Another Tree
- Joining a thread 等另一个线程执行完(die)
- 常见Linux OS防火墙命令汇总(不断更新中...)
- Android 开发者的 RxJava入门教程
- 【数据库管理】ORA-01017错误及部分的常见典型案例
- android 签名工具 autoSign jarsigner
- rand()函数与srand()函数的对比与使用
- python 爬虫第一步
- 用RxJava实现事件总线(Event Bus)
- VS“提示无法启动调试未安装Silverlight”的解决办法