我对Java中的线程比较陌生。我想知道以下是否可能。恢复一个线程并传入一个Java中的对象
- 线程[a]被调用(来自另一个对象)。
- 它做了一些东西,然后在同一个对象中启动另一个线程[b]。
- 然后它暂停自己并等待另一个线程完成。
- 当它结束时,它将它正在处理的结果传递给暂停的线程[a]并恢复它。
- 线程[a]然后将结果返回给调用它的原始对象。
谢谢!
我对Java中的线程比较陌生。我想知道以下是否可能。恢复一个线程并传入一个Java中的对象
谢谢!
有很多方法可以做到这一点。
以下示例通常是完成任务的最佳方式。它在主线程中执行了一些工作,然后将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
默认使用非守护线程应用程序不会退出,直到它被关闭。
那么线程a的SynchronousQueue如何等待take()
from和线程b put()
是它的结果?
同步队列类似于CSP和Ada中使用的集合信道。它们非常适合于越区切换设计,其中在一个线程中运行的对象必须与在另一个线程中运行的对象同步,以便交付一些信息,事件或任务。
如果你想添加超时,让线程poll()
为结果和线程b offer()
它。
如果你想在Java中使用线程来简化你的生活,请不要使用wait(),notify()你将不得不使用同步的方法和语句,我的建议是使用ReentrantLock和Condition主线程从线程
这看起来很有趣,我会记住这一点。我不认为它有办法显式传递一个对象回到原始线程。 – 2013-03-10 13:24:51
我认为你要找的是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();
}
}
}
它表现良好。你运行它了吗?我做到了。守护线程的使用不是强制性的。 – mschonaker 2013-03-11 06:53:19
我跑了它,它绝对不会自然退出。如果从命令行运行它,提示不会返回。 – 2013-03-11 10:11:32
好的。固定。谢谢。 – mschonaker 2013-03-11 16:14:41
为什么没有一个做B的工作? – mschonaker 2013-03-09 15:26:14
简单的答案是“当然有”,实际上有一百万种方法。查看'ExecutorService','Semaphore's,'Thread.join()'等。 – 2013-03-09 15:31:40
线程跨对象运行。因此,在第一步中,线程[a]正在运行,并且在其中,另一个对象将调用对象[x]上的方法。在最后一步中,它是对象[x]上的方法将结果返回给原始对象。这发生在线程[a]中。 – flup 2013-03-09 15:59:56