Re: [問題] 如何中斷跑到一半的程式

看板java作者 (五薀皆空)時間13年前 (2012/08/30 02:27), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《LaPass (LaPass)》之銘言: : 以下範例徒手key的,可能會打錯字,以及少做try...catch之類的 : 請自已修正 : 法一: : Thread + 設個flag去判斷 : class UI{ : ... : .... : Thread t; : boolean b=true; : public void StartButton(){ : t=new Thread(new Runnable(){ : void run(){ : while(b) : { : //要做的一些事情 : } : } : }); : } : public void StopButton(){ : b=false; : } : } : 這種方法比較好,有些東西做到一半被停掉的話會很麻煩 : 用flag的方式比較能讓程式自己決定該不該中止,以及把一些該收尾的事情做一做 : 但這也只適用於迴圈類型的程式 : 法二: : class UI{ : ... : .... : Thread t; : public void StartButton(){ : t=new Thread(new Runnable(){ : void run(){ : //要做的一些事情 : } : }); : } : public void StopButton(){ : if(t!=null)t.interrupt(); : } : } : 用interrupt去中斷他 : 但是,印象中如果有像這樣的片段 : try { } : finally { } : 會直接被中斷掉,而不會去做finally的動作去收尾 : 還有,如果是第一次使用執行緒的話 : 請去看一下關於執行緒安全之類的問題、文章 直接呼叫interrupt()並不會中止執行緒 要做到可以用stop() 但是不安全,因為程序可能會在任何地方中止而發生不可預期的錯誤 所以還要在程序中可以安全中斷的地方加入判斷式 if(t.isInterrupted())break; 如果是被sleep、join、wait阻斷時就用try catch捕捉 try { Thread.sleep(1000); } catch (InterruptedException e) { break; } 還有就算你在上面的try catch後面加finally 他還是會執行 finally一定會執行,除非你下System.exit()關掉JVM或是你電腦當機 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.156.136 ※ 編輯: pzyc79 來自: 118.160.156.136 (08/30 02:29)

08/30 09:00, , 1F
瞭解了 感謝
08/30 09:00, 1F

08/31 00:21, , 2F
若根據p大講解,stop() deprecated之後
08/31 00:21, 2F

08/31 00:23, , 3F
已經沒有辦法可以直接中斷thread,而是程式裡中斷?
08/31 00:23, 3F

08/31 00:48, , 4F
stop()還是可以作用 不過就如上面所說的 能不用就不要用
08/31 00:48, 4F
文章代碼(AID): #1GFbxuNT (java)
文章代碼(AID): #1GFbxuNT (java)