多线程之join方法 (转)
2015-07-10 10:13
381 查看
join方法用得不多,当A线程执行到了B线程的join()方法时,A就会等待,等B线程都运行完,A线程才会执行。使用join()方法时,会产生异常。
用一个小程序说明join方法的使用技巧:
class Demo implements Runnable
{
public void run()
{
for(int x=1; x<100; x++)
{
System.out.println(Thread.currentThread().getName() + "..." + x);
}
}
}
public class JoinDemo
{
public static void main(String[] args) throws Exception
{
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t1.join();
t2.start();
for(int x=1; x<100; x++)
{
System.out.println(Thread.currentThread().getName() + "..." + x);
}
}
}
主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来。
join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件,我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。
如果将t1.join()和t2.start()位置互换,又会怎样呢?主线程开启了t1、t2,这时候CPU执行权还在主线程手里。当主线程碰到了t1.join(),释放执行权,处于冻结状态。活着的t1、t2都具备执行资格,这时候CPU便对t1和t2交替执行。主线程要等到t1结束才能活,至于t2结不结束,与主线程没有丝毫关系。如果t1结束了,t2还没结束,主线程就会和t2抢执行权执行。主线程碰到谁的join,它就等谁。也就是说,谁让它把执行权放出来,它就等谁死。至于谁去抢,它不管。
用一个小程序说明join方法的使用技巧:
class Demo implements Runnable
{
public void run()
{
for(int x=1; x<100; x++)
{
System.out.println(Thread.currentThread().getName() + "..." + x);
}
}
}
public class JoinDemo
{
public static void main(String[] args) throws Exception
{
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t1.join();
t2.start();
for(int x=1; x<100; x++)
{
System.out.println(Thread.currentThread().getName() + "..." + x);
}
}
}
主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来。
join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件,我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。
如果将t1.join()和t2.start()位置互换,又会怎样呢?主线程开启了t1、t2,这时候CPU执行权还在主线程手里。当主线程碰到了t1.join(),释放执行权,处于冻结状态。活着的t1、t2都具备执行资格,这时候CPU便对t1和t2交替执行。主线程要等到t1结束才能活,至于t2结不结束,与主线程没有丝毫关系。如果t1结束了,t2还没结束,主线程就会和t2抢执行权执行。主线程碰到谁的join,它就等谁。也就是说,谁让它把执行权放出来,它就等谁死。至于谁去抢,它不管。
相关文章推荐
- LeetCode "Palindrome Linked List"
- oauth2.0在监控宝项目中的应用一例
- 跳过设置向导方法
- Apache实现负载均衡
- 13家中国域名商(国际域名)解析量报告(7月7日)
- PHP框架
- [leetcode][list] Palindrome Linked List
- Java基础之理解Annotation
- 2014上海全国邀请赛(hdu 5090 - 5099)dp+线段树+拓扑排序+bfs(状态压缩)
- 常用汉字
- JDBC基本操作介绍
- 移动支付官方文档列表
- 有return的情况下try catch finally的执行顺序(转)
- Java C# .net 和 C C++ 跨平台的区别
- 将应用图标添加到ubuntu dash中
- 基于jquery鼠标点击图片翻开切换效果
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
- kafka 集群运维和使用
- 给app重新签名
- jquery的$(#id).each()和jquery.each()的用法区别