Thraed.Abort()和Thread.Interrupt()之間的區別是什麼?我怎樣才能以線程安全的方式給他們打電話。如果提供了簡單的例子,這將會很有幫助。.NET中線程中斷和中斷之間的區別
回答
首先,這些都不是好的線程同步結構。
首先,Thread.Abort說:「我不在乎你在做什麼,只是停止做,並保持現在的一切。它基本上是說「嘿,揍它」的編程方式。如果您的線程正在打開文件,那些文件將保持打開狀態,直到垃圾回收完成並最終確定您的對象。
Thread.Abort應該只能在應用程序域被拆除的情況下被使用,甚至可能不會被使用,最好只在進程被終止的情況下。
其次,Thread.Interrupt是一個相當奇怪的野獸。它基本上說「我不在乎你在等什麼,不要再等待它了」。這裏的奇怪之處在於,如果線程當前不在等待任何事情,那就是「我不在乎你將要等下一個什麼,但是當你這樣做時,立刻停止等待」。
這些都是跡象表明,你正在將自己的意志強加於並非旨在被告知此類事情的線程上。
爲了正確中止線程,線程應定期檢查某種標誌,無論是簡單易變的布爾變量還是事件對象。如果標誌顯示「你現在應該終止」,那麼線程應該以有序的方式從方法返回來終止自己。
爲了正確地喚醒線程,線程應該在需要等待同步對象的地方包含一個「請停止等待」的對象,它也會等待。所以基本上它會讓它所需要的對象變成信號,或者「停止等待」對象變成信號,確定哪個對象做了什麼,並做正確的事情。
所以不是Thread.Abort的和了Thread.interrupt,你應該使用正常的同步對象,如事件,互斥,信號等
出於同樣的原因,Thread.Suspend和Thread.Resume應該被單獨留在家中寫你的線程,並且它們在.NET的更高版本中也被廢棄了。
除非你調用當前執行的線程上Abort
或Interrupt
(如ASP.NET不會突然終止請求,例如),你基本上不能叫他們一個線程安全的方式。
使用WaitHandle
或Monitor.Wait
/Pulse
以可喚醒的方式等待。如果你正在拆卸應用程序,你應該只中止其他線程,否則你可能會以未知狀態結束。
請參閱my article on graceful thread termination瞭解如何很好地完成此操作的示例。
好的文章Jon.By的方式我可以在哪裏找到您的網絡廣播? – user186973 2009-10-12 18:12:17
@threadinglearner:你的意思是網播嗎? – 2009-10-12 18:32:37
關於C的任何事情# – user186973 2009-10-12 18:50:39
Thread.Abort()在目標線程上產生ThreadAbortException。它通常是爲了強制線程終止。停止線程處理不是推薦的做法。
Thread.Interrupt()中斷一個處於WaitSleepJoin狀態的線程 - 實際上阻塞了像WaitHandle這樣的資源。這允許調用者解除對線程的阻塞。
兩者都不是真正的「線程安全」 - 即它們專門用於以難以預測的方式影響線程行爲。
通常建議使用同步對象(如WaitHandles或Semaphores)來允許線程安全地彼此同步。
Abort和Interrupt之間的區別在於,雖然它們都會拋出一個異常(ThreadAbortException和ThreadInterruptException),但調用Abort會重新拋出catch塊末尾的異常,並確保結束正在運行的線程。
- 1. 信號,軟件中斷和硬件中斷之間的區別?
- 2. TRAP,軟件中斷和硬件中斷之間的區別?
- 3. Thread.sleep()和斷點之間的區別(掛起線程)
- 4. ARM Cortex中的事件和中斷之間有什麼區別?
- 5. 線程和中斷
- 6. PHP中斷和繼續之間的區別?
- 7. 線程中斷()不會中斷線程
- 8. SQL Server存儲過程中返回和中斷之間的區別
- 9. 中斷線程
- 10. 線程中斷
- 11. 啓用中斷和恢復中斷有什麼區別?
- 12. 線程中斷和ActionListener Java
- 13. 通過單例對象強制中斷線程之間的中斷(學術)
- 14. Android中進程,活動,線程和任務之間的區別
- 15. BackgroundWorker和線程之間的區別?
- 16. thread.start()和executor.submit(線程)之間的區別
- 17. Eclipse中的「切換線斷點」和「切換斷點」有什麼區別?
- 18. java中的線程中斷
- 19. Java中的線程中斷
- 20. 中斷Java中的線程
- 21. 中斷DatagramSocket.receive中的線程
- 22. 中斷java中的線程
- 23. 之前調用的Future.get()中斷線程
- 24. 如何判斷源代碼和發佈的.NET代碼之間的區別?
- 25. 線程的mmap中的MAP_PRIVATE和MAP_SHARED之間的區別
- 26. SwingWorker中斷線程
- 27. Java - 中斷線程?
- 28. 什麼是Asynctask和android中的線程之間的區別?
- 29. 多線程中Event和Mutex之間的區別
- 30. JavaScript和PHP之間的前瞻斷言的懶惰區別
你能提供一個你想要做什麼的例子嗎?你的問題的當前形式有矛盾。 – Gary 2009-10-12 18:00:25