线程结束监听器。 Java的

时间:2011-03-02 15:03:12

标签: java multithreading actionlistener

Java中是否有任何监听器可以处理某些线程已经结束? 像这样:

Future<String> test = workerPool.submit(new TestCalalble());
test.addActionListener(new ActionListener()               
   {                                                         
    public void actionEnd(ActionEvent e)               
    {                                                        
        txt1.setText("Button1 clicked");                        
    }                                                        
   });

我知道,不可能像这样处理,但我希望在某些线程结束时得到通知。

通常我用这个Timer类来检查每个Future的状态。但这不是很好的方式。 感谢

7 个答案:

答案 0 :(得分:12)

您可以使用CompletionService

CompletionService<Result> ecs
       = new ExecutorCompletionService<Result>(e);
ecs.submit(new TestCallable());
if (ecs.take().get() != null) {
    // on finish
}

另一种选择是使用Guava的ListenableFuture

代码示例:

ListenableFuture future = Futures.makeListenable(test);
future.addListener(new Runnable() {
 public void run() {
   System.out.println("Operation Complete.");
   try {
     System.out.println("Result: " + future.get());
   } catch (Exception e) {
     System.out.println("Error: " + e.message());
   }
 }
}, exec);

就个人而言,我更喜欢番石榴溶液。

答案 1 :(得分:3)

您可以实施观察员模式来报告完成情况。

public interface IRunComplete {
    public void reportCompletion(String message);
}

让Thread调用者实现此接口。

并在run()方法中最后调用此方法。所以现在你确切知道这个线程什么时候结束。

试试吧。我实际上正在使用它,它工作正常。

答案 2 :(得分:2)

这是一个 geekish 监听器。非常不明智的使用,但有趣和聪明

Thread t = ...
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        t.getThreadGroup().uncaughtException(t, e);//this is the default behaviour
    }       
    protected void finalize() throws Throwable{
        //cool, we go notified
      //handle the notification, but be worried, it's the finalizer thread w/ max priority
    }
});

效果可以通过PhantomRefernce更好地实现

希望你有一点微笑:)


旁注:你问的是 NOT thread end ,但是任务完成事件和最好的覆盖decorateTaskafterExecute

答案 3 :(得分:2)

如果不添加大量额外代码,您可以自行制作一个快速监听线程,如下所示:

//worker thread for doings
Thread worker = new Thread(new Runnable(){ 
    public void run(){/*work thread stuff here*/}
});
worker.start();
//observer thread for notifications
new Thread(new Runnable(){
    public void run(){
    try{worker.join();}
    catch(Exception e){;}
    finally{ /*worker is dead, do notifications.*/}
}).start();

答案 4 :(得分:1)

没有。这样的倾听者不存在。 但是你有2个解决方案。

  1. 添加代码,通知您线程已在run()方法
  2. 的末尾完成
  3. 使用返回类型Callable结果的Future接口。您可以向Future询问状态是什么,并使用阻止方法get()来检索结果

答案 5 :(得分:1)

你有一个Thread类定义的join()方法。但是,您无法直接查看在并发API情况下执行Callable的线程。

答案 6 :(得分:1)

使用此示例:

public class Main {

    public static void main(String[] args) {

        CompletionListener completedListener = count -> System.out.println("Final Count Value: " + count);

        HeavyWorkRunnable job = new HeavyWorkRunnable(completedListener);

        Thread otherThread = new Thread(job);
        otherThread.start();

    }

    static class HeavyWorkRunnable implements Runnable {

        CompletionListener completionListener;

        public HeavyWorkRunnable(CompletionListener completionListener) {
            this.completionListener = completionListener;
        }


        @Override
        public void run() {

            int count = 0;

            for (int i = 0; i < 10; i++) {

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Clock Tick #"+i);

                count += 1;

            }

            if (completionListener != null) {
                completionListener.onCompleted(count);
            }
        }
    }

    @FunctionalInterface
    interface CompletionListener {

        void onCompleted(int count);

    }
}