最近我鑽研了線程的黑暗藝術,我學會了如何創建它們以及何時使用它們以及何時不使用它們。但是當我試圖學習如何溝通它們時,我發現管道是你用來做的。我有一個對象,它是我創建的一個類的實例「,但管道似乎只能發送字節數組或整數。我不會能夠使用類似於對象流的東西來將我的對象發送給另一個線程,但是我的網上衝浪已經非常糟糕,我迷路了。所以我猜想唯一要做的就是轉向堆棧溢出,看看有沒有人可以幫忙。感謝您提前的幫助。與兩個線程通信時,我必須使用管道嗎?
1
A
回答
5
您應該使用BlockingQueue的實現之一。
我最常使用ArrayBlockingQueue,因爲它允許我限制解決方案的內存佔用。 A LinkedBlockingDeque可用於無限大小,但請確保您不能超載內存。
這裏有兩個線程使用ArrayBlockingQueue
來溝通自己。
public class TwoThreads {
public static void main(String args[]) throws InterruptedException {
System.out.println("TwoThreads:Test");
new TwoThreads().test();
}
// The end of the list.
private static final Integer End = -1;
static class Producer implements Runnable {
final BlockingQueue<Integer> queue;
public Producer(BlockingQueue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for (int i = 0; i < 1000; i++) {
queue.add(i);
Thread.sleep(1);
}
// Finish the queue.
queue.add(End);
} catch (InterruptedException ex) {
// Just exit.
}
}
}
static class Consumer implements Runnable {
final BlockingQueue<Integer> queue;
public Consumer(BlockingQueue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
boolean ended = false;
while (!ended) {
try {
Integer i = queue.take();
ended = i == End;
System.out.println(i);
} catch (InterruptedException ex) {
ended = true;
}
}
}
}
public void test() throws InterruptedException {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
Thread pt = new Thread(new Producer(queue));
Thread ct = new Thread(new Consumer(queue));
// Start it all going.
pt.start();
ct.start();
// Wait for it to finish.
pt.join();
ct.join();
}
}
+0
這正是我所期待的。這個編程的東西,我只是繼續學習!謝謝! – NicholasLupo
相關問題
- 1. 多個線程與管道流進行通信並使用PushbackInputStream
- 2. 我必須使用多少個線程
- 3. C中的管道 - 我必須使用fork嗎?
- 4. 使用兩個管道的雙向進程間通信
- 5. 兩個子進程與管道之間進行通信
- 6. epoll:我必須使用多線程
- 7. 我必須使用BreezeController嗎?
- 8. 在使用線程時,我絕對必須使用靜態變量嗎?
- 9. 創建線程時,我們何時必須使用LPTHREAD_START_ROUTINE?
- 10. 我可以使用類變量與線程通信嗎?
- 11. 使用管道進行過程通信
- 12. 使用管道的進程間通信
- 13. 進程與管道之間的通信
- 14. 我必須爲Posix計時器使用信號處理程序嗎?
- 15. 兩個子進程通過命名管道進行通信
- 16. 使用管道在多線程程序與孩子溝通
- 17. 使用moq時,我必須知道所有將被使用的方法嗎?
- 18. 獲取「調用線程必須STA的」使用MVVM光信息
- 19. 必須在單線程程序中使用鎖嗎?
- 20. 管道通信
- 21. 使用管道與子進程進行通信
- 22. 何時以及爲什麼我必須關閉管道?
- 23. 管理RHEL更新 - 我必須使用RHN嗎?
- 24. 兩個線程在兩個運行時如何通信?
- 25. 我必須使用Flash Media Encoder嗎?
- 26. 我必須使用django註冊嗎?
- 27. 我必須使用wsgi_module的「def application」嗎?
- 28. 我必須使用ContinueWith和HttpClient嗎?
- 29. 我必須使用按鈕嗎?
- 30. 我必須使用連接表嗎? [MYSQL]
退房[類似](http://stackoverflow.com/questions/2170520/inter-thread-communication-in-java)[問題](http://stackoverflow.com/questions/9242204/線程間通信)替代選項 –
也有類似的問題,但我找不到一個有我的答案或問我問的問題。 – NicholasLupo
你從哪裏得到管道?這似乎離開了左邊的領域。你是指不同的過程? – matt