我認爲我做錯了。我正在創建線程,以便從共享隊列中剔除一些數據。我的問題是程序速度慢,內存不足,我懷疑隊列可能不像我希望的那樣共享。我懷疑這是因爲在我的代碼中,我添加了一行顯示隊列的大小,如果我啓動2個線程,然後我得到兩個完全不同數字的輸出,似乎自己增加(我認爲它可能是相同的數字,但也許它從100跳到2,等等,但看完它後顯示105和5,並以不同的速率運行,如果我有4個線程,那麼我看到4個不同的數字)。如何實現一個可以被多個線程處理的隊列?
這是相關部分的片段。我在節目
static class queue_class {
int number;
int[] data;
Context(int number, int[] data) {
this.number = number;
this.data = data;
}
}
然後我將一些職位的調用後創建隊列的頂部創建隊列我想要的數據靜態類..
static class process_threaded implements Callable<Void> {
// queue with contexts to process
private Queue<queue_class> queue;
process_threaded(queue_class request) {
queue = new ArrayDeque<queue_class>();
queue.add(request);
}
public Void call() {
while(!queue.isEmpty()) {
System.out.println("in contexts queue with a size of " + queue.size());
Context current = contexts.poll();
//get work and process it, if it work great then the solution goes elsewhere
//otherwise, depending on the data, its either discarded or parts of it is added back to queue
queue.add(new queue_class(k, data_list));
,你可以看到,數據有3個選項,如果數據是好的,就會被髮送出去,如果數據完全可怕或丟回隊列就丟棄。我認爲隊列正在發送,但我懷疑是因爲每個線程都在自己的隊列中工作,而不是共享隊列。
這是猜測正確的,我在做這錯了嗎?
此代碼不會編譯。你是否嘗試編譯和執行某些東西,然後問一個具體的問題,而不是編寫一個不被java編譯器接受的僞代碼? – 2012-04-14 04:24:19
我的實際代碼編譯..我沒有想到任何人都想編譯它,所以我拿了代碼,清理了與問題無關的信息,只是爲了展示我在做什麼。我不需要代碼只是邏輯,並認爲上面的代碼應該讓我知道我在做什麼。 – 2012-04-14 04:33:28
您應該閱讀[實踐中的Java併發](http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601)以編寫線程安全代碼的專業知識。 – 2012-04-14 04:54:35