日期:2014-05-20  浏览次数:20805 次

如何获得线程结束消息
加入主线程启动一个子线程,当子线程结束时,主线程能够立刻被通知,请问有什么方法

------解决方案--------------------
使用 Google Guava 提供的 ListeningExecutorService 启动线程会返回一个 ListenableFuture<?>。

Java code
ListenableFuture<XX> future = ...;
Futures.addCallback(future,
     new FutureCallback<XX> {
       public void onSuccess(XX result) {
         xx(result);
       }
       public void onFailure(Throwable t) {
         reportError(t);
       }
     });

------解决方案--------------------
Java code

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();
    }
}

------解决方案--------------------
探讨

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

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


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

------解决方案--------------------
我想是否可以考虑使用守护线程
------解决方案--------------------
如果主线程没事做的话,可以等待子线程结束:childThread.join(); //等待childThread线程执行结束。
否则的话,主线程要另外再开一个子线程,在这个新开的子线程里什么都不干,就等待:childThread.join();