我对java中的线程比较新。我想知道以下是否可行。
谢谢!
答案 0 :(得分:2)
有很多方法可以做到这一点。
以下示例通常是完成任务的最佳方式。它在主线程中做了一些工作然后将Callable
传递给ExecutorService
,它在另一个线程中做了一些工作。对future.get
的调用将阻塞,直到第二个线程完成,并返回Object
返回的Callable
。
private static final ExecutorService executorService = Executors.newFixedThreadPool(1);
public static void main(String[] args) {
//do some stuff
final Future<Object> future = executorService.submit(new MyOtherWork());
final Object object;
try {
object = future.get();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
} catch (ExecutionException ex) {
//handle exception
}
//do some other stuff
}
private static class MyOtherWork implements Callable<Object> {
public Object call() throws Exception {
//do stuff in another thread
}
}
请注意,由于ExecutorService
默认使用非守护程序线程,因此应用程序在关闭之前不会退出。
答案 1 :(得分:1)
如果你想让你的生活更轻松使用java中的Threads不使用wait(),notify()你将不得不使用synchronized方法和语句,我的建议是使用你从中传递的ReentrantLock和Condition辅助线程的主线程
答案 2 :(得分:0)
线程a等待take()
的{{3}}和线程b put()
的结果如何?
同步队列类似于CSP和Ada中使用的集合点通道。它们非常适用于切换设计,其中在一个线程中运行的对象必须与在另一个线程中运行的对象同步,以便将其传递给某些信息,事件或任务。
如果您想要添加超时,请为poll()
添加结果,并为其offer()
添加帖子。
答案 3 :(得分:0)
我认为您所寻找的是java.util.Callable
和java.util.Executors
。
这是我能编写的最短代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestCallable {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
Integer five = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
return executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 5;
}
}).get();
} finally {
executor.shutdown();
}
}
}).get();
System.out.println(five); // prints 5
} finally {
executor.shutdown();
}
}
}