如何获得线程结束消息

杀手 2012-10-15 10:29:59
加入主线程启动一个子线程,当子线程结束时,主线程能够立刻被通知,请问有什么方法
...全文
340 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2012-10-16
  • 打赏
  • 举报
回复

public interface ThreadListener {
public void threadStart(Object source);
public void threadFinished(Object source);
}

public class MyThread extends Thread {
public ThreadListener listener;
public void setThreadListener(ThreadListener tl){
this.listener = tl;
}
public void run(){
if(this.listener != null)
this.listener.threadStart(this);
//......

if(this.listener != null)
this.listener.threadFinished(this);
}
}

public class Main implements ThreadListener {

public void threadStart(Object source){
System.out.println("线程开始了");
}
public void threadFinished(Object source){
System.out.println("线程结束了");
}
private void test(){
Thread[] threads = new Thread[10];
for(int i=0; i<threads.length; i++){
MyThread thread = new MyThread();
thread.setThreadListener(this);
thread.start();

threads[i] = thread;
}
for(Thread thead : threads){
thread.join();
}
}
public static void main(String[] args){
Test t = new Test();
t.test();
}
}

夜雨双唱2016 2012-10-16
  • 打赏
  • 举报
回复
如果主线程没事做的话,可以等待子线程结束:childThread.join(); //等待childThread线程执行结束。
否则的话,主线程要另外再开一个子线程,在这个新开的子线程里什么都不干,就等待:childThread.join();
jacky花园 2012-10-16
  • 打赏
  • 举报
回复
我想是否可以考虑使用守护线程
龙四 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
楼主描述不祥,就是通知了主线程之后主线程要干些什么,通知的时候主线程正在干什么

比如主线程只在执行其它语句,通知到它它该如何处理


我的意思是当一个子线程结束后,主线程能够立刻知道子线程结束了,有什么方法
[/Quote]

主要问题在于主线程此时在不在执行其它动作,如果在执行其它动作就不好办了
杀手 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
楼主描述不祥,就是通知了主线程之后主线程要干些什么,通知的时候主线程正在干什么

比如主线程只在执行其它语句,通知到它它该如何处理
[/Quote]

我的意思是当一个子线程结束后,主线程能够立刻知道子线程结束了,有什么方法
龙四 2012-10-16
  • 打赏
  • 举报
回复
楼主描述不祥,就是通知了主线程之后主线程要干些什么,通知的时候主线程正在干什么

比如主线程只在执行其它语句,通知到它它该如何处理
杀手 2012-10-16
  • 打赏
  • 举报
回复
系统自带的有吗,类似于钩子
杀手 2012-10-15
  • 打赏
  • 举报
回复
如果不加外包,还有什么方法吗
huntor 2012-10-15
  • 打赏
  • 举报
回复
使用 Google Guava 提供的 ListeningExecutorService 启动线程会返回一个 ListenableFuture<?>。

ListenableFuture<XX> future = ...;
Futures.addCallback(future,
new FutureCallback<XX> {
public void onSuccess(XX result) {
xx(result);
}
public void onFailure(Throwable t) {
reportError(t);
}
});
杀手 2012-10-15
  • 打赏
  • 举报
回复
自顶!

62,614

社区成员

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

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