我正在尝试使用Java 8的完整图功能,该功能说它可以异步运行。但是为了执行"未来"中的内容,需要调用future.get()
方法。这样做会阻止主线程。当它等待30秒时,才能在future.get()
之后执行线
有没有办法实现这一目标?执行非阻止方式我正在尝试打印
之前"我将在主线程中运行。"
"我将在单独的线程中运行比主线程。"
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
@Override
public void run() {
// Simulate a long-running Job
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
System.out.println("I'll run in a separate thread than the main thread.");
}
});
future.get();
System.out.println("I'll run in the main thread.");
}
CompletableFuture.runAsync(Runnable)
已经启动您的其他线程运行。调用future.get()
只是等待该线程完成运行并获得结果的一种方式,然后继续进行呼叫。
当您立即启动线程并立即进行get
时,无需在(就像您一样)之间做任何事情时,没有任何意义来运行线程。
如果我正确理解的话,您要实现的目标并不是那么微不足道。您有一个输入的呼叫,并且想要处理此呼叫而不会干扰,并且在此线程的侧面,您想运行一个独立于主过程的单独过程。(如果我被误解,请纠正我)
我解决这个问题的方法是队列。您主线程在队列上发布一些内容,并执行其需要执行的内容。然后,有单独的消费者在队列上聆听,这将执行另一个过程而不会影响主线程。