3 回答

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
線程停止后,您無(wú)法重新啟動(dòng)它。但是,沒(méi)有什么能阻止您創(chuàng)建和啟動(dòng)新線程。
選項(xiàng)1:創(chuàng)建新線程而不是嘗試重新啟動(dòng)。
選項(xiàng)2:不要讓線程停止,讓它等待,然后當(dāng)它收到通知時(shí),你可以讓它再次工作。這樣線程永遠(yuǎn)不會(huì)停止,永遠(yuǎn)不需要重新啟動(dòng)。
根據(jù)評(píng)論進(jìn)行編輯:
要“殺死”線程,您可以執(zhí)行以下操作。
yourThread.setIsTerminating(true); // tell the thread to stop
yourThread.join(); // wait for the thread to stop

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
除非在該線程中運(yùn)行的代碼檢查并允許終止,否則無(wú)法終止線程。
你說(shuō):“可悲的是我必須殺死/重啟它......我沒(méi)有完全控制線程的內(nèi)容,對(duì)于我的情況,它需要重新啟動(dòng)”
如果線程的內(nèi)容不允許終止其exectuion,那么你就無(wú)法終止該線程。
在你的帖子中你說(shuō):“我的第一次嘗試是使用ExecutorService,但我似乎找不到重啟任務(wù)的方法。當(dāng)我使用.shutdownnow()......”
如果查看“shutdownnow”的來(lái)源,它只會(huì)運(yùn)行并中斷當(dāng)前運(yùn)行的線程。這不會(huì)停止執(zhí)行,除非這些線程中的代碼檢查它是否已被打亂,如果是,則自行停止執(zhí)行。因此,shutdownnow可能沒(méi)有按照你的想法行事。
讓我說(shuō)明當(dāng)我說(shuō)線程的內(nèi)容必須允許該線程被終止時(shí)我的意思:
myExecutor.execute(new Runnable() { public void run() { while (true) { System.out.println("running"); } } });myExecutor.shutdownnow();
該線程將繼續(xù)運(yùn)行,即使調(diào)用了shutdownnow,因?yàn)樗肋h(yuǎn)不會(huì)檢查它是否已被終止。但是,該線程將關(guān)閉:
myExecutor.execute(new Runnable() { public void run() { while (!Thread.interrupted()) { System.out.println("running"); } } });myExecutor.shutdownnow();
由于該線程檢查它是否已被中斷/關(guān)閉/終止。
因此,如果您想要一個(gè)可以關(guān)閉的線程,您需要確保它檢查它是否已被中斷。如果你想要一個(gè)可以“關(guān)閉”和“重新啟動(dòng)”的線程,你就可以創(chuàng)建一個(gè)可以執(zhí)行前面提到的新任務(wù)的runnable。
為什么不能關(guān)閉正在運(yùn)行的線程?好吧,我實(shí)際上撒謊,你可以調(diào)用“yourThread.stop()”,但為什么這是一個(gè)壞主意?當(dāng)你停止它時(shí),線程可以處于同步(或其他關(guān)鍵部分,但我們將限制自己使用這里的同步關(guān)鍵字保護(hù)的部分)部分代碼。synch塊應(yīng)該在它們的整數(shù)中執(zhí)行,并且在被其他一些線程訪問(wèn)之前只能由一個(gè)線程執(zhí)行。如果在同步塊中間停止某個(gè)線程,則synch塊保護(hù)的保護(hù)將失效,程序?qū)⑦M(jìn)入未知狀態(tài)。開(kāi)發(fā)人員將內(nèi)容置于同步塊中以保持同步,如果使用threadInstance.stop()則會(huì)破壞同步的含義,

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
要啟動(dòng)或重新啟動(dòng)(一旦線程停止,您就無(wú)法重新啟動(dòng)相同的線程,但這并不重要;只需創(chuàng)建一個(gè)新Thread實(shí)例):
// Create your Runnable instance
Task task = new Task(...);
// Start a thread and run your Runnable
Thread t = new Thread(task);
要停止它,請(qǐng)?jiān)谀腡ask實(shí)例上設(shè)置一個(gè)方法,設(shè)置一個(gè)標(biāo)志來(lái)告訴run方法退出; 從run退出線程返回。如果您的調(diào)用代碼需要知道線程在返回之前已經(jīng)停止了,您可以使用join:
// Tell Task to stop
task.setStopFlag(true);
// Wait for it to do so
t.join();
關(guān)于重新啟動(dòng):即使Thread無(wú)法重新啟動(dòng),也可以使用Runnable新線程重用您的實(shí)例,如果它具有狀態(tài)并且您想要保留; 這是相同的事情。只需確保您Runnable的設(shè)計(jì)允許多次通話run。
添加回答
舉報(bào)