多线程的join问题 求解

Surrin1999 2018-08-16 03:15:42
//主类

public class Example12_9_2 {
public static void main(String[] args) {
ThreadJoin_2 room = new ThreadJoin_2();
Thread customer = new Thread(room,"顾客");
Thread cakeMaker = new Thread(room,"蛋糕师");
room.setJoinThread(cakeMaker);
customer.start();
}
}


//问题所在类

public class ThreadJoin_2 implements Runnable{
Thread joinThread;
private Object obj = new Object();
public void setJoinThread(Thread joinThread) {
this.joinThread = joinThread;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在等待");
try {
joinThread.start();
joinThread.join();
} catch (InterruptedException |IllegalThreadStateException e) {
System.out.println(Thread.currentThread().getName()+" --- 发生了异常 --- "+e.getLocalizedMessage());
} finally {
System.out.println(Thread.currentThread().getName()+"正在执行");
}
if(Thread.currentThread().getName().equals("顾客")) {
System.out.println("顾客准备吃蛋糕");
}
if(Thread.currentThread().getName().equals("蛋糕师")) {
System.out.println("蛋糕师再做蛋糕");
}
}
}



问题有两个:

一 当直接运行时为什么ThreadJoin_2 类会抛出异常?是哪一步抛出了异常?如何解决呢?

二 为什么debug和直接执行结果不一样? 我加了断点调试后 在ThreadJoin_2 类join执行那里就停掉了 程序就不走了 即使是finally都没走 这又是为什么呢?
...全文
1397 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
huwao 2018-08-20
  • 打赏
  • 举报
回复
join的话debug会停下来等待你的下一次运行的,这样不行。你试试停下来的时候再次直接运行,用debug调试join的话不会很直观的,栈跟踪是没办法自己做出多线程的交互的。
西陵布衣 2018-08-18
  • 打赏
  • 举报
回复
直接查看抛出异常的callstack。就大概知道哪一步
Surrin1999 2018-08-17
  • 打赏
  • 举报
回复
下午结分 哈哈
Dan淡淡的心 2018-08-17
  • 打赏
  • 举报
回复
没事 这东西 比较隐蔽
verejava 2018-08-17
  • 打赏
  • 举报
回复
Java 多线程 之 join加入 线程实例

http://www.verejava.com/?id=16992940862472
Surrin1999 2018-08-17
  • 打赏
  • 举报
回复
引用 26 楼 qq_41054313 的回复:
你在线程2 的11行加了断点 程序在那里卡住 不会向后执行 然后线程1的话就很明显了 join要等待到线程1执行完 所以 debug就卡住了

这下真的懂了!!之前debug的都是单线程 原来多线程要在上面那点击另外线程继续调试。。 非常感谢!!
Dan淡淡的心 2018-08-17
  • 打赏
  • 举报
回复
你在线程2 的11行加了断点 程序在那里卡住 不会向后执行 然后线程1的话就很明显了 join要等待到线程1执行完 所以 debug就卡住了
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
这两天看看有没其他高见就结分 谢谢各位
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
引用 20 楼 u010348570 的回复:
run肯定没问题啊 控制台都能打印的 估计你编辑工具的问题 当前线程进入等待,debug到join这句就没法自动捕获线程跟踪下一步代码了

好吧 谢谢了! 程序感觉现在应该是没问题了 以后我换IDEA试试
叫我放猪之人 2018-08-16
  • 打赏
  • 举报
回复
run肯定没问题啊 控制台都能打印的 估计你编辑工具的问题 当前线程进入等待,debug到join这句就没法自动捕获线程跟踪下一步代码了
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
引用 16 楼 ws_tan 的回复:
要把join注释掉

注释掉就和原意不符了 蛋糕师做好蛋糕。。顾客才吃 debug问题好像只有我出了??难道是我IDE出问题了。。
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
引用 17 楼 u010348570 的回复:
顾客线程执行到join方法时,该线程就进入等待了,下一步是执行蛋糕师线程了,所以debug不到下一步了。。。

但是。。我直接run没问题
叫我放猪之人 2018-08-16
  • 打赏
  • 举报
回复
顾客线程执行到join方法时,该线程就进入等待了,下一步是执行蛋糕师线程了,所以debug不到下一步了。。。
  • 打赏
  • 举报
回复
要把join注释掉
  • 打赏
  • 举报
回复
蛋糕师线程正在执行的时候,你又去执行启动蛋糕师线程,所以会报异常,至于第二个问题,我这边没有出现
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
引用 13 楼 a_xufeng 的回复:
我用你的代码debug,没有遇到你所说的问题。你可以试着在join的实现那里f5,进去里面的实现看看,是停在那一边了。


停在这里了。。。
a_xufeng 2018-08-16
  • 打赏
  • 举报
回复
我用你的代码debug,没有遇到你所说的问题。你可以试着在join的实现那里f5,进去里面的实现看看,是停在那一边了。
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
引用 10 楼 qq_41054313 的回复:
debug我用的不多 是整个程序已经结束了还停在那里么?

停在那里了 下一个断点也没法走了。。。 很神奇
Surrin1999 2018-08-16
  • 打赏
  • 举报
回复
引用 9 楼 u010348570 的回复:
调不下去了,你join时当前线程就进入等待了,不知道下一步干啥了


啥意思 顾客线程中加入了蛋糕师线程并join。。有什么问题吗 我直接run也没事的。。就是debug卡死在join那里
叫我放猪之人 2018-08-16
  • 打赏
  • 举报
回复
调不下去了,你join时当前线程就进入等待了,不知道下一步干啥了
加载更多回复(9)

62,616

社区成员

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

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