Java - 特定线程结束后触发操作

Java - fire action after specific Thread has ended

这是我的代码:

Thread T = new Thread() {
    public void run() {
        //some code here...
    }
};
T.start();

我需要知道这个特定线程何时结束,以便我可以在之后立即开始另一个代码,类似于这个假设的选项:

T.finished(){
    //some code here
}

编辑: @swpalmer 提供的解决方案与所有其他解决方案相比是最直接和最简单的,我不认为这是重复的,因为公认的解决方案是与其他的不同,并且真的非常容易实施,但做了它应该做的和我要求的!

这里:

 public void run() {
    //some code here...
    whatever.finished();
 }

这是解决此问题的直接方法:您在线程中的 最后一个 操作是发送 "event".

当然,您也可以使用 Thread.join() 从外部执行此操作。

考虑使用 java.util.concurrent.CompletionStage

而不是 Thread

您可以使用 whenComplete() 或其他方法之一将操作链接在一起。

查看示例here

    CompletableFuture.runAsync(() -> {
        //some code here...
        System.out.println("Hi!");
    }).thenRun(() -> {
        //some code here
        System.out.println("Greeting completed");
    });

啊,好奇怪的问题。你想要的是一个回调 - 一种在完成先前的任务时需要被推送到线程调用堆栈的方法。一个粗略的方法是在你的任务之后定义一个新任务(使用 Runnable 或 Callable):

Thread T = new Thread() {
    public void run() {
        //after this code finished
        Runnable callback = () -> {//some task};
        ES.submit(callback);    //ES = ExecutorService
    }
};

现在假设你想在第二个任务完成时执行一个任务。你会做这样的事情:

Thread T = new Thread() {
    public void run() {
        //after this code finished
        Runnable callback = () -> {
            //task completed
            //second callback
            Runnable callback2 = () -> {};
            ES.submit(callback2);
        };
    }
};

您会看到代码变得丑陋且不合常理(臭名昭著的 'Callback Hell')。为了解决这个问题,Java 8 引入了 CompleteableFuture<T> class。您基本上可以获得 CompleteableFuture<T> 作为承诺,然后应用以下方法:

promise.thenApplyAsync(callback).thenApplyAsync(callback)...

CompletableFutures<T> 字面意思是 Javascript 承诺 - 它们可以处于待定阶段,或完成,或完成时出现错误。

反应流是下一步。但是当然,要理解它,你需要正确理解上面的东西。