2011-10-16 69 views
4

我有一個按鈕「addCashier」,它正在創建一個名爲「Cashier」的線程,現在這個線程僅僅是每4秒鐘產生一次命令,而run()方法中的while線。一切都很好,但現在我想添加一個按鈕來模擬收銀員註銷。我在我的while循環onDuty和一個公共函數logOff()中添加了一個布爾變量,它將onDuty布爾值設置爲false以使我脫離run的while循環。我現在的問題是從我的gui類如何調用特定線程上的函數?每個出納線程都在運行時生成,所以我不知道他們的名字。停止特定的java線程

我希望我有道理。提前致謝。

+0

這取決於你如何創建線程。你能通過數組引用它嗎? –

+0

嗯我不知道你可以存儲數組中的線程對象我會看看這種方法。 – mikeyP

+0

@mikeyP - 你也可以把它們放在'HashMap ';你提到了一些關於他們具有「名字」的東西,這將是('String')鍵。 –

回答

7
Thread t = CashierThread(); //keep the reference to thread somewhere... 

的現在,而不是內置的中斷旗布爾屬性使用:

public void run() { 
    while(!Thread.currentThread().isInterrupted()) { 
    //... 
    } 
} 

當您想通過點擊一個按鈕開啓線程需要調用:

t.interrupt(); 

當然,您需要訪問客戶端代碼中的t變量。

+0

+1:雖然正確,但我只是爲了更短的'while(!Thread.interrupted())'而假設我正要退出線程。 –

+0

儘管這是停止線程的一種方法,但它不會對他現有的布爾解決方案做任何事情。他的真正問題是他沒有跟蹤他的線索,也不知道如何去阻止他們。 –

+0

好的感謝Tomasz和其他人..只是試圖找出如何得到這個線程參考。 – mikeyP

1

您可以將每個線程的參考存儲到一個HashMap - 以及它的idName作爲關鍵。稍後,當您想要處理某個特定的收銀線程時,請使用Nameid從HashMap中獲取相應的Thread,並在其上調用相應的logOff()方法。

1

如果收集對所有線程的引用是一個問題,另一種方法可能是將公共靜態同步HashMap的threadId(在運行時分配給每個線程的隨機數)作爲鍵和布爾值作爲值。您可以修改while循環以從該集中式映射中選擇相應的布爾值。這可以讓你註銷一個特定的收銀員。

1

你可以保持線程對象的引用的地方好讓你可以調用threadObj.logOff()

如果你不願意這樣做,那麼在創建thred U可以的唯一名稱分配給線程。

public void run() 
{ 
    this.setName(strCashireID); 
    ...... 
} 

在運行時,U可以通過獲取線程:

Thread getThread(String strCashireID) { 
    ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); 
    Threads[] threads = new Thread[ threadGroup.activeCount() ]; 
    threadGroup.enumerate(threads); 
    for (int nIndex=0; nIndex<threads.length; nIndex++) { 
     if(threads[nIndex] != null && threads.getName().equals(strCashireID) { 
     return threads[nIndex]; 
     } 
    } 
    return null; 
} 

我還是會建議ü存儲線程對象的哈希表,而不是在運行時列舉他們。