我有一個特定的Java客戶端庫的問題。這裏的情況是:庫缺陷證明與開發者側應用程序錯誤
我已使用該庫的程序。該程序是一個名爲'WorkerThread'的類,它擴展了Thread。爲了啓動它,我創建了一個Main類,它只包含一個啓動線程的main()函數,沒有別的。工作人員使用庫來執行與服務器的通信並獲得結果。 當我想同時運行2個WorkerThreads時出現問題。我首先做的是這樣做的主要類:
public class Main
{
public static void main(String args[])
{
new WorkerThread().start(); // 1st thread.
new WorkerThread().start(); // 2nd thread.
}
}
當我運行此,這兩個線程產生不合理的結果更有甚者,一些成果應該由第一個線程收到上述第二接收,而不是。
如果不是上述情況,我就跑每一個線程的2個獨立的進程,然後一切工作正常。
另外:
1.有內部的WorkerThread不使用靜態類或方法可能導致的問題。我的應用程序只包含工作線程類,並且不包含靜態字段或方法
2.該庫應該可用於多線程環境。在我的線程中,我只是創建一個庫的類的新實例,然後調用它的方法。而已。
我的問題是這樣的: 不知道我的實現的任何細節,上面的情況和事實足以證明在圖書館有一個錯誤,而不是在我的程序?假設圖書館可能會使用靜態對象或庫創建的線程之間共享的對象(這是由我的2個線程間接共享的並導致此問題)是否安全?如果沒有,那麼錯誤來源於工人階級代碼的假設情況是什麼?
編輯:我沒有說的庫,因爲我想知道,如果以上事實可以獨立於庫的產生回答我的問題,但無論如何,該庫是兔子MQ Java客戶端。每個線程創建1個連接和2個通道,並使用一個發佈數據和一個接收結果。
編輯2:新的事實:問題似乎取決於在哪我送東西給隊列的速度。發送速度較慢會降低錯誤結果的數量。
結果如何收到?在控制檯上? – Bozho 2010-04-20 17:44:34
你應該首先用絕對最小的邏輯來製作一個非常簡單的程序版本,但函數調用庫。圖書館是否聲稱完全是線程安全的?可能有API調用不是。另外,讓我們知道如果庫是lib,將會提供什麼幫助,因爲我們可能有同樣的問題。 – 2010-04-20 17:45:00
是和否:在它們顯示在控制檯中之前,工作線程檢查它是否得到預期的結果,如果它沒有得到預期的結果,它會使用System.err來顯示它 – Paralife 2010-04-20 17:47:11