我正在尝试使用Java 8的CompletableFuture功能,该功能表示它具有异步运行的功能。但是,为了执行“未来”中的内容,需要调用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.");
}
答案 0 :(得分:1)
CompletableFuture.runAsync(Runnable)
已经开始运行其他线程。调用future.get()
只是在继续执行该线程之前,等待该线程完成运行并获得其结果的一种方法。
当您启动线程并立即get
,而又没有做任何事情时(如您所做的),那么就没有必要运行线程了。
答案 1 :(得分:0)
如果我理解正确的话,您要实现的目标将不是一件容易的事。您有一个进入的呼叫,并且您希望在不干扰的情况下处理此呼叫,并且希望在此线程的旁边运行独立于主进程的单独进程。 (如果我误会了,请纠正我)
我要解决此问题的方法是使用队列。您的主线程将某些内容发布到队列中并执行需要执行的内容。然后,有单独的使用者在队列上侦听,这将执行其他过程而不会影响主线程。