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