求教多线程join的一个小例子问题

aaa19891215 2016-10-13 09:57:36


线程调用join之后 不是等线程执行完了再执行join之后的操作吗 ?求教为什么我的join不生效?

11111按道理不是应该打印在最后一行吗 怎么跑第二行去了?
...全文
116 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaa19891215 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 CatWitch 的回复:
因为你循环中每次都是new了一个新的thread,join应该是join一个已经正在运行的,但是你join了一个刚new但是还没开始运行的,使用方法有错,所以11111在最上面的打印了,因为没有找到需要等待执行完毕的线程
这是我写了一个demo,你看看,分别去掉t1和t2的join会有什么变化
public class TestJoin {

public static void main(String[] args) {
TestJoin testJoin = new TestJoin();
try {
ThreadProcess t1 =testJoin.new ThreadProcess(1);
ThreadProcess t2 =testJoin.new ThreadProcess(2);
t1.start();
t1.join();
t2.start();
t2.join();
} catch (Exception e) {
e.printStackTrace();
}

System.out.println("1111111111");
}

class ThreadProcess extends Thread {

private int mm;

public ThreadProcess(int mm){
this.mm = mm;
}

public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(mm);
}
}
}
}


我用你的执行多次 也会出现在中间的情况。
CatWitch 2016-10-13
  • 打赏
  • 举报
回复
因为你循环中每次都是new了一个新的thread,join应该是join一个已经正在运行的,但是你join了一个刚new但是还没开始运行的,使用方法有错,所以11111在最上面的打印了,因为没有找到需要等待执行完毕的线程 这是我写了一个demo,你看看,分别去掉t1和t2的join会有什么变化 public class TestJoin { public static void main(String[] args) { TestJoin testJoin = new TestJoin(); try { ThreadProcess t1 =testJoin.new ThreadProcess(1); ThreadProcess t2 =testJoin.new ThreadProcess(2); t1.start(); t1.join(); t2.start(); t2.join(); } catch (Exception e) { e.printStackTrace(); } System.out.println("1111111111"); } class ThreadProcess extends Thread { private int mm; public ThreadProcess(int mm){ this.mm = mm; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(mm); } } } }
achiman 2016-10-13
  • 打赏
  • 举报
回复
因为你用的是system.err而不是system.out,System.err打出来的信息常常会跑到System.out信息的前面去,可以自行百度下二者区别
CatWitch 2016-10-13
  • 打赏
  • 举报
回复
引用 2 楼 aaa19891215 的回复:
[quote=引用 1 楼 CatWitch 的回复:] 因为你循环中每次都是new了一个新的thread,join应该是join一个已经正在运行的,但是你join了一个刚new但是还没开始运行的,使用方法有错,所以11111在最上面的打印了,因为没有找到需要等待执行完毕的线程 这是我写了一个demo,你看看,分别去掉t1和t2的join会有什么变化 public class TestJoin { public static void main(String[] args) { TestJoin testJoin = new TestJoin(); try { ThreadProcess t1 =testJoin.new ThreadProcess(1); ThreadProcess t2 =testJoin.new ThreadProcess(2); t1.start(); t1.join(); t2.start(); t2.join(); } catch (Exception e) { e.printStackTrace(); } System.out.println("1111111111"); } class ThreadProcess extends Thread { private int mm; public ThreadProcess(int mm){ this.mm = mm; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(mm); } } } }
我用你的执行多次 也会出现在中间的情况。[/quote] 我这边11111出现在中间的前提是注释掉t2.join(),如果不注释,11111必定会是在最后一个

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧