錯誤停止執行緒

2021-09-29 07:47:58 字數 2493 閱讀 8756

主要包括以下二大方面:

第一:採用stop方法來停止執行緒,會導致執行緒執行到一半突然停止,沒辦法完成乙個基本單位的操作,會造成髒讀資料,且會釋放監視鎖

suspend方法不會釋放鎖,容易造成死鎖

第二:volatile在生產者模式下會失效,執行緒長時間阻塞,就沒法停止執行緒

/**

* 描述: 演示用volatile的侷限part2 陷入阻塞時,volatile是無法執行緒的

此例中,生產者的生產速度很快,消費者消費速度慢,所以阻塞佇列滿了以後,生產者會阻塞,等待消費者進一步消費

*/public class wrongwayvolatilecantstop

system.out.println("消費者不需要更多資料了。");

//一旦消費不需要更多資料了,我們應該讓生產者也停下來,但是實際情況

producer.canceled=true;

system.out.println(producer.canceled);

}}class producer implements runnable

@override

public void run()

num++;

}} catch (interruptedexception e) finally

}}class consumer

public boolean needmorenums()

return true;

}}

程式的執行結果為執行緒一直在執行,沒有停止

修正:使用thread物件引用的interrupt()方法,並在run方法中使用thread.currentthread().isinterrupted(),

/**

* 描述: 用中斷來修復剛才的無盡等待問題

*/public class wrongwayvolatilefixed

system.out.println("消費者不需要更多資料了。");

producerthread.interrupt();//重點在這

class producer implements runnable

@override

public void run()

num++;

}} catch (interruptedexception e) finally }}

class consumer

public boolean needmorenums()

return true;}}

}

第三:

判斷執行緒是否已經被中斷的方法

**demo:

public class rightwayinterrupted 

}});

// 啟動執行緒

threadone.start();

//設定中斷標誌

threadone.interrupt();

//獲取中斷標誌

system.out.println("isinterrupted: " + threadone.isinterrupted());

//獲取中斷標誌並重置

system.out.println("isinterrupted: " + threadone.interrupted());

//獲取中斷標誌並重直

system.out.println("isinterrupted: " + thread.interrupted());

//獲取中斷標誌

system.out.println("isinterrupted: " + threadone.isinterrupted());

threadone.join();

system.out.println("main thread is over.");

}}

執行結果為:

isinterrupted: true,當前執行緒已經給中斷訊號,所以能接收到中斷資訊

isinterrupted: false,所呼叫的方法為靜態的方法,該方法會清除中斷資訊,獲取不到

isinterrupted: false,此時該方法的目標物件是main執行緒,而main執行緒沒有誰來發中斷訊號,也就獲取不到中斷資訊了

isinterrupted: true,該方法不會清除中斷訊號,因此可以接收到

第四:1.如何停止執行緒?,可以分為以下情況來回答

原理,用interrupt來請求,好處

想停止執行緒,要請求方法,被停止方,子方法被呼叫的配合

最後再說錯誤的方法,:stop/suspend,volatile修飾的boolean無法處理長時間阻塞的情況

2.如何處理不可中斷的阻塞(reentrantlock,和io)?

針對不同的情況,採取不同的策略,並用能夠響應中斷的類,比如reentrantlock的lock方法,可以用其interrupted方法

停止多執行緒錯誤方法1

使用原有的停止方法,目前已經廢棄 stop suspend和resume 錯誤的停止方法 用stop 來停止執行緒,會導致執行緒執行一半突然停止,沒辦法完成乙個基本單位的操作 乙個連隊 會造成髒資料 多領取和少領取 public class stopthread implements runnabl...

執行緒之停止執行緒

停止執行緒有三種方法 1.建議正常停止 利用次數,不建議死迴圈 2.建議使用標誌位 設定乙個標誌位 3.不要使用stop或者destoy等過時或者jdk不建議使用的方法舉例說明 想讓乙個正在執行的程式停下來,執行其他程式,執行完以後再進行自己的程式 怎麼來解決呢?可以自己設定乙個標識位.在自己的程式...

執行緒的停止

執行緒停止 執行緒的停止 1.停止乙個執行緒 我們一般都會通過乙個變數去控制的。2.如果需要停止乙個處於等待狀態下的執行緒,那麼我們需要通過變數配合notify方法或者interrupt 來使用。public class threaddemo5 extends thread public synch...