簡體   English   中英

在一個線程上調用sleep正在使我的所有線程都處於休眠狀態(Java)

[英]Calling sleep on one thread is sleeping all my threads (Java)

我有一組工作人員,每個工作人員都有自己的線程,如下所示:

for (int i = 0; i < numWorkers; i++)
    {
        workers.addElement(new Worker(this, i));
        Thread t = new Thread(workers.elementAt(i));
        workerThreads.addElement(t);
        t.start();
    }

每個工作程序的向量中都有其編號,當我需要停止線程時,請執行以下操作:

fp.workerThreads.elementAt(number).sleep(move.amount*1000);

但是,即使我認為我在單個線程上調用sleep,也正在停止向量中的所有工作線程。 有任何想法嗎? 謝謝!

因此,您要在此處執行的操作是從主線程調用您的一個工作對象上的sleep。

fp.workerThreads.elementAt(number).sleep(move.amount*1000);

如果您必須在工作線程之一中睡眠。 您必須確保要從嘗試進入睡眠的線程中調用Thread.sleep()方法。 如您所見,Thread.sleep是一個靜態方法,它不在乎您在哪個線程對象上調用sleep,而是在哪個線程上是當前線程。 我希望這有幫助。

從技術上講這不是錯誤的 ,但卻是可怕的:

Thread t = ...;
...
t.sleep();

這不是“錯誤的”,因為編譯器將允許您執行此操作。 這很可怕,因為它具有誤導性:程序員似乎認為sleep()調用將使t線程化。 但這根本不是真的。

IMO是Java語言的設計師在讓您編寫代碼時犯下的最大錯誤之一。 如果您的程序要調用sleep *,請按照以下步驟操作:

Thread.sleep();

*但是為什么要全部調用sleep()? 除非出於教育目的,否則調用Thread.sleep()的Java程序要么包含重新發明的輪子,要么由於某些不適當的原因而處於休眠狀態。 (提示:如果您的程序有同步問題,則無法使用sleep()進行修復。您所能做的就是使問題在測試期間更不可能被發現,因此在現場發生的可能性更大。當它最終發生時。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM