我對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