我对java中的线程比较陌生。我想知道以下是否可能。
- (从另一个对象)调用线程 [a]。
- 它做了一些事情,然后在同一个对象中启动另一个线程 [b]。
- 然后它会暂停自己并等待另一个线程完成。
- 当它完成时,它将正在处理的结果传递给暂停的线程 [a] 并恢复它。
- 然后线程 [a] 将结果返回给调用它的原始对象。
谢谢!
我对java中的线程比较陌生。我想知道以下是否可能。
谢谢!
有很多方法可以做到这一点。
以下示例通常是完成任务的最佳方式。它在主线程中做一些工作,然后将 a 传递给在另一个线程中做一些工作的Callable
an 。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
默认情况下使用非守护线程,因此您的应用程序在关闭之前不会退出。
如果您想使用 Java 中的线程让您的生活更轻松,请不要使用 wait()、notify(),您将不得不使用同步方法和语句,我的建议是使用从主线程传递到的 ReentrantLock 和 Condition次要线程
线程 a 正在等待的SynchronousQueuetake()
和线程 bput()
的结果如何?
同步队列类似于 CSP 和 Ada 中使用的集合通道。它们非常适合切换设计,其中一个线程中运行的对象必须与另一个线程中运行的对象同步,以便将一些信息、事件或任务交给它。
如果要添加超时,请让线程 apoll()
获得结果,线程 b 获得结果offer()
。
我认为您正在寻找的是java.util.Callable
and 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();
}
}
}