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
承诺 - 它们可以处于待定阶段,或完成,或完成时出现错误。
反应流是下一步。但是当然,要理解它,你需要正确理解上面的东西。
这是我的代码:
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
承诺 - 它们可以处于待定阶段,或完成,或完成时出现错误。
反应流是下一步。但是当然,要理解它,你需要正确理解上面的东西。