线程引发的代码,怎么判断代码已执行完毕;

OPPPPOP 2015-10-26 09:39:46
加精
一段代码,比如

while(true) {
//我需要在这里判断一下以下的代码进程全部已结束
(new Thread(){
public void run() {
System.out.println("11");
new XXJFrame().show();
System.out.println("22");
}
}).start();
}

,请注意 11、22几乎是同时打印的,因为
//XXJFrame不是阻塞的或者说模态的;不局限于此例子,比如XXFrame替换为另外一段需要执行很久的线程;
//怎么判断代码已执行完毕?
我需要的是根据进程树查找之类的代码,而不是给XXJFrame加关闭事件 或 重写起dispose方法之类 或在明确知道程序要结束的地方通知主函数它结束了!
...全文
4121 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongchihao1 2015-11-15
  • 打赏
  • 举报
回复
nomasp 2015-11-13
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/391846276?page=2#post-400564942 还不错喔,给这个帖子加了推荐一个月后你得了一本书我得了10C币…… @antiwise
sinat_28629645 2015-11-13
  • 打赏
  • 举报
回复
感谢楼主分享!
羽缘的小窝 2015-11-03
  • 打赏
  • 举报
回复
获取当前线程,判断其状态, 或者使用线程池execute来写
OPPPPOP 2015-11-03
  • 打赏
  • 举报
回复
我已经有思路了,分析ManagementFactory.getThreadMXBean()的结果是可以的!!!呵呵
soton_dolphin 2015-11-03
  • 打赏
  • 举报
回复
在 java.util.concurrency 里面 有Lock 和 Condition 类, 楼主可以研究一下 Conditon.await() 和 Conditoin.signalAll()方法
敲代码的小猪 2015-11-03
  • 打赏
  • 举报
回复
学到了 不错楼主
小灰狼 2015-11-02
  • 打赏
  • 举报
回复
引用 12 楼 antiwise 的回复:
[quote=引用 11 楼 hemowolf 的回复:] 线程A启动线程 A.1、A.2、A.3……A.n 线程 A.1 又启动 A.1.1、A.1.2、A.1.3……A.1.n …… 想保证线程A结束时,A.1、A.2、A.3 ……A.n …… A.1.1、A.1.2、A.1.3……A.1.n …… 全部结束? 可以参考一下 Thread.join() 方法
我需要的是在线程代码中加入代码来判断线程是否在运行; 你可以理解我这个小程序是个小应用 我想知道除过系统的线程 还有while(true)线程;其他的线程、 界面 是否在运行 ; 加入代码就写死了; 上面的界面判断我也给出了代码 类似于那样 不需要额外的加入我的代码 ;但是我觉得那还不是我想要的; 我想知道通过jvm级别的判断;或者类似于Windows编程里的HWDL那样的; 就比如我发的Eclipse里的Terminate功能,想知道这个是怎么实现的 [/quote] 不是很明白你的需求 感觉象是你想通过程序,来控制进程中的其它线程 如果是这样的话,你可以试一下 ThreadGroup 类,问下度娘怎么用
Geekkkkkkkk 2015-11-02
  • 打赏
  • 举报
回复
静态变量?..
OPPPPOP 2015-10-31
  • 打赏
  • 举报
回复
注意Eclipse里的Terminate不是仅仅结束JVM; 还能点击切换看到其他的正在执行的控制台;结束JVM那个用System.exit或者交给上级启动JVM的程序来处理我都知道的; 我用Csharp 的Process启动了java进程只能操作Java这一个主进程,获取输出 输入 错误啥的;希望我描述清楚了
OPPPPOP 2015-10-31
  • 打赏
  • 举报
回复
引用 11 楼 hemowolf 的回复:
线程A启动线程 A.1、A.2、A.3……A.n 线程 A.1 又启动 A.1.1、A.1.2、A.1.3……A.1.n …… 想保证线程A结束时,A.1、A.2、A.3 ……A.n …… A.1.1、A.1.2、A.1.3……A.1.n …… 全部结束? 可以参考一下 Thread.join() 方法
我需要的是在线程代码中加入代码来判断线程是否在运行; 你可以理解我这个小程序是个小应用 我想知道除过系统的线程 还有while(true)线程;其他的线程、 界面 是否在运行 ; 加入代码就写死了; 上面的界面判断我也给出了代码 类似于那样 不需要额外的加入我的代码 ;但是我觉得那还不是我想要的; 我想知道通过jvm级别的判断;或者类似于Windows编程里的HWDL那样的; 就比如我发的Eclipse里的Terminate功能,想知道这个是怎么实现的
小灰狼 2015-10-30
  • 打赏
  • 举报
回复
线程A启动线程 A.1、A.2、A.3……A.n 线程 A.1 又启动 A.1.1、A.1.2、A.1.3……A.1.n …… 想保证线程A结束时,A.1、A.2、A.3 ……A.n …… A.1.1、A.1.2、A.1.3……A.1.n …… 全部结束? 可以参考一下 Thread.join() 方法
skgary 2015-10-30
  • 打赏
  • 举报
回复
引用 楼主 antiwise 的回复:
一段代码,比如

while(true) {
//我需要在这里判断一下以下的代码进程全部已结束
(new Thread(){
public void run() {
System.out.println("11");
new XXJFrame().show();
System.out.println("22");
}
}).start();
}
,请注意 11、22几乎是同时打印的,因为 //XXJFrame不是阻塞的或者说模态的;不局限于此例子,比如XXFrame替换为另外一段需要执行很久的线程; //怎么判断代码已执行完毕? 我需要的是根据进程树查找之类的代码,而不是给XXJFrame加关闭事件 或 重写起dispose方法之类 或在明确知道程序要结束的地方通知主函数它结束了!
还有一个非常传统的做法叫回调函数,但java的程序员很少用,C的程序员是经常用的。
alan19931103 2015-10-30
  • 打赏
  • 举报
回复
5楼说的发布静态变量不行么?
skgary 2015-10-29
  • 打赏
  • 举报
回复
引用 6 楼 antiwise 的回复:
发现SWing对所有 的Window与Frame缓存起来,界面上可以用一下代码解决

isReady = true;
			if(!"logout".equals(cmd)) {
				for(Window wind : Window.getWindows()) {
					if(wind.isShowing()) {
						isReady = false;
						break;
					}
				}
			}
			if(!isReady || loading.isShowing()) {
				System.out.println("Busy!");
				continue;
			}
目前比较满意 但是对于Thread ThreadMXBean mxBean = ManagementFactory.getThreadMXBean(); for(ThreadInfo ti : mxBean.dumpAllThreads(false, false)) { System.out.println(ti.getThreadName()+ "," + ti.getThreadState()); } 不怎么好使,Thread目前还是无解
多线程的话,自己把时序画好就可以了,没有那么复杂,总有解的。
skgary 2015-10-29
  • 打赏
  • 举报
回复
while(true) { //我需要在这里判断一下以下的代码进程全部已结束 (new Thread(){ public void run() { System.out.println("11"); JFrame f= new XXJFrame().show(); System.out.println("22"); ===> f.close(); } }).start(); }
OPPPPOP 2015-10-29
  • 打赏
  • 举报
回复
发现SWing对所有 的Window与Frame缓存起来,界面上可以用一下代码解决

isReady = true;
			if(!"logout".equals(cmd)) {
				for(Window wind : Window.getWindows()) {
					if(wind.isShowing()) {
						isReady = false;
						break;
					}
				}
			}
			if(!isReady || loading.isShowing()) {
				System.out.println("Busy!");
				continue;
			}
目前比较满意 但是对于Thread ThreadMXBean mxBean = ManagementFactory.getThreadMXBean(); for(ThreadInfo ti : mxBean.dumpAllThreads(false, false)) { System.out.println(ti.getThreadName()+ "," + ti.getThreadState()); } 不怎么好使,Thread目前还是无解
qq_30676355 2015-10-28
  • 打赏
  • 举报
回复
发布静态变量!
OPPPPOP 2015-10-27
  • 打赏
  • 举报
回复
二楼的东西我研究过,只能在线程里用吧? 而且我的意思是线程或Dialog 如果 线程里又启动其他的子线程, 更无解了; 三楼你的代码我觉得是造了一个模态的代码;这个对于我的while循环体就阻塞了,因为我还有其他的代码需要执行;仅仅是查找某一类的线程发起后是否已经结束了,然后本次再起这一类的线程进行操作; 我觉得也许Java实现不了这样的逻辑;因为Java的线程不像CSharp Process那样会有子的进程id,记录它登记了多少个进程,然后可以异步启动,还不影响其他的代码执行。
有点异样 2015-10-27
  • 打赏
  • 举报
回复
不知道是否解答了你的问题?

//jdk1.5及以上
Future future1 = Executors.newCachedThreadPool().submit(new Thread() {

@Override
public void run() {
System.out.println("11");
//new XXJFrame().show();
System.out.println("22");
}

});
if(future1.isDone()){//线程是否已经完成 非阻塞

}
//future1.get(); //此处阻塞 一定完成线程才会往下走

加载更多回复(2)
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

62,614

社区成员

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

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