被Thread弄得快疯了,如何安全Java中如何正确的终止线程程

C#中如何安全的终止Thread线程_百度知道
C#中如何安全的终止Thread线程
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自电脑网络类芝麻团
采纳数:26496
获赞数:33272
参与团队:
简单的方法是,Thread.CurrentThread.Abort()用于终止当前线程。当然了,你需求中不但要终止当前线程,还要执行别的业务,弹出form。那么就需要一个新的委托,在线程过程中调用这个委托来终止现成,从而达到在终止线程后执行其他业务。大概代码,我就写个大概的:public delegate void StopThreadDelegate(Thread t);static void StopThread(Thread t){//关闭线程t.Abort();//启动新窗体}public static void Main(){new Thread(delegate(object data){//这里是你的执行逻辑//当要执行退出线程时dynamic d =//var d = (StopThreadDelegate) //非4.0d(Thread.CurrentThread);}).Start(new StopThreadDelegate(StopThread));}
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。求助,C#如何安全的关闭线程,之后在重新打开这个线程?
[问题点数:60分]
本版专家分:9
结帖率 70%
CSDN今日推荐
本版专家分:51873
2016年4月 .NET技术大版内专家分月排行榜第二2016年2月 .NET技术大版内专家分月排行榜第二
2017年3月 .NET技术大版内专家分月排行榜第三2017年2月 .NET技术大版内专家分月排行榜第三2016年9月 .NET技术大版内专家分月排行榜第三2016年8月 .NET技术大版内专家分月排行榜第三2016年7月 .NET技术大版内专家分月排行榜第三2016年3月 .NET技术大版内专家分月排行榜第三2016年1月 .NET技术大版内专家分月排行榜第三2015年12月 .NET技术大版内专家分月排行榜第三2015年11月 .NET技术大版内专家分月排行榜第三
本版专家分:20
本版专家分:29334
2016年10月优秀大版主
恭喜您,在2016年6月份获得优秀版主称号恭喜您,在2016年4月份获得优秀版主称号恭喜您,在2016年5月份获得优秀版主称号恭喜您,在2016年8月份获得优秀版主称号2015年9月优秀大版主2015年5月优秀大版主2014年11月论坛优秀版主
2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号
2014年12月 企业软件大版内专家分月排行榜第一2014年11月 企业软件大版内专家分月排行榜第一2014年7月 企业软件大版内专家分月排行榜第一2011年10月 企业开发大版内专家分月排行榜第一2011年5月 企业开发大版内专家分月排行榜第一2011年3月 企业开发大版内专家分月排行榜第一2010年12月 企业开发大版内专家分月排行榜第一2010年11月 企业开发大版内专家分月排行榜第一2010年9月 企业开发大版内专家分月排行榜第一2010年8月 企业开发大版内专家分月排行榜第一2010年7月 企业开发大版内专家分月排行榜第一2010年6月 企业开发大版内专家分月排行榜第一2010年5月 企业开发大版内专家分月排行榜第一
2011年4月 企业开发大版内专家分月排行榜第二
本版专家分:520
本版专家分:520
本版专家分:350
本版专家分:9
本版专家分:9
本版专家分:51873
2016年4月 .NET技术大版内专家分月排行榜第二2016年2月 .NET技术大版内专家分月排行榜第二
2017年3月 .NET技术大版内专家分月排行榜第三2017年2月 .NET技术大版内专家分月排行榜第三2016年9月 .NET技术大版内专家分月排行榜第三2016年8月 .NET技术大版内专家分月排行榜第三2016年7月 .NET技术大版内专家分月排行榜第三2016年3月 .NET技术大版内专家分月排行榜第三2016年1月 .NET技术大版内专家分月排行榜第三2015年12月 .NET技术大版内专家分月排行榜第三2015年11月 .NET技术大版内专家分月排行榜第三
本版专家分:9
本版专家分:9
本版专家分:9
本版专家分:520
本版专家分:520
本版专家分:350
本版专家分:9
本版专家分:13858
本版专家分:9
本版专家分:9
本版专家分:9
本版专家分:350
匿名用户不能发表回复!
其他相关推荐如何:创建和终止线程 (C#)
MSDN Library
如何:创建和终止线程(C# 编程指南)
此示例演示如何创建辅助线程,并用它与主线程并行执行处理。还将演示如何使一个线程等待另一个线程,并正确地终止线程。有关多线程处理的背景信息,请参见和。 该示例创建一个名为 Worker 的类,该类包含辅助线程将执行的方法 DoWork。这实际上是辅助线程的 Main 函数。辅助线程将通过调用此方法来开始执行,并在此方法返回时自动终止。DoWork 方法如下所示:
public void DoWork()
while (!_shouldStop)
Console.WriteLine("worker thread: working...");
Console.WriteLine("worker thread: terminating gracefully.");
Worker 类包含另一个方法,该方法用于通知 DoWork 它应当返回。此方法名为 RequestStop,如下所示:
public void RequestStop()
_shouldStop = true;
RequestStop 方法只是将 true 赋给 _shouldStop 数据成员。由于此数据成员由 DoWork 方法来检查,因此这会间接导致 DoWork 返回,从而终止辅助线程。但是,需要注意:DoWork 和 RequestStop 将由不同线程执行。DoWork 由辅助线程执行,而 RequestStop 由主线程执行,因此 _shouldStop 数据成员声明为 volatile,如下所示:
private volatile bool _shouldS
volatile 关键字用于通知编译器,将有多个线程访问 _shouldStop 数据成员,因此它不应当对此成员的状态做任何优化假设。有关更多信息,请参见 。 通过将 volatile 与 _shouldStop 数据成员一起使用,可以从多个线程安全地访问此成员,而不需要使用正式的线程同步技术,但这仅仅是因为 _shouldStop 是 bool。这意味着只需要执行单个原子操作就能修改 _shouldStop。但是,如果此数据成员是类、结构或数组,那么,从多个线程访问它可能会导致间歇的数据损坏。假设有一个更改数组中的值的线程。Windows 定期中断线程,以便允许其他线程执行,因此线程会在分配某些数组元素之后和分配其他元素之前被中断。这意味着,数组现在有了一个程序员从不想要的状态,因此,读取此数组的另一个线程可能会失败。 在实际创建辅助线程之前,Main 函数会创建一个 Worker 对象和
的一个实例。线程对象被配置为:通过将对 Worker.DoWork 方法的引用传递给 Thread 构造函数,来将该方法用作入口点,如下所示:
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
此时,尽管辅助线程对象已存在并已配置,但尚未创建实际的辅助线程。只有当 Main 调用
方法后,才会创建实际的辅助线程:
workerThread.Start();
此时,系统将启动辅助线程的执行,但这是在与主线程异步执行的。这意味着 Main 函数将在辅助线程进行初始化的同时继续执行代码。为了保证 Main 函数不会尝试在辅助线程有机会执行之前将它终止,Main 函数将一直循环,直到辅助线程对象的
属性设置为 true:
while (!workerThread.IsAlive);
下一步,通过调用
来将主线程中断片刻。这保证了辅助线程的 DoWork 函数在 Main 函数执行其他任何命令之前,在 DoWork 方法内部执行若干次循环:
Thread.Sleep(1);
在 1 毫秒之后,Main 将通知辅助线程对象,它应当使用 Worker.RequestStop 方法(前面已介绍)自行终止:
workerObject.RequestStop();
还可以通过调用
来从一个线程终止另一个线程,但这会强行终止受影响的线程,而不管它是否已完成自己的任务,并且不提供清理资源的机会。此示例中显示的技术是首选方法。 最后,Main 函数对辅助线程对象调用
方法。此方法导致当前线程阻塞或等待,直到对象所表示的线程终止。因此,直到辅助线程返回后,Join 才会返回,然后自行终止:
workerThread.Join();
此时,只有执行 Main 的主线程还存在。它会显示一条最终消息,然后返回,从而使主线程也终止。 下面显示了完整的示例:
using System.T
public class Worker
// This method will be called when the thread is started.
public void DoWork()
while (!_shouldStop)
Console.WriteLine("worker thread: working...");
Console.WriteLine("worker thread: terminating gracefully.");
public void RequestStop()
_shouldStop = true;
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldS
public class WorkerThreadExample
static void Main()
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// Start the worker thread.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");
// Loop until worker thread activates.
while (!workerThread.IsAlive);
// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);
// Request that the worker thread stop itself:
workerObject.RequestStop();
// Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
main thread: starting worker thread...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: terminating gracefully...
main thread: worker thread has terminated
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
摘要:线程创建与终止线程创建[b]Thread类与Runnable接口的关系[/b]publicinterfaceRunnable{publicabstractvoidrun();}publicclassThreadimplementsRunnable{/*Whatwillberun.*/privateR....../***CausesthisththeJavaVirtualMachine*callsthe&lt
线程创建与终止
[b]Thread类与Runnable接口的关系[/b] public interface Runnable { public abstract void run();}public class Thread implements Runnable { /* What will be run. */ private R ...... /** * Causes this threa the Java Virtual Machine * calls the &code&run&/code& method of this thread. */ public synchronized void start() {......} ...... @Override public void run() {if (target != null) {target.run();} } ......}
Thread类与Runnable接口都位于java.lang包中。从上面我们可以看出,Runnable接口中只定义了run()方法,Thread类实现了Runnable 接口并重写了run()方法。当调用Thread 类的start()方法时,实际上Java虚拟机就去调用Thread 类的run()方法,而Thread 类的run()方法中最终调用的是Runnable类型对象的run()方法。
[b]继承Thread并重写run方法[/b] public class ThreadTest1 extends Thread { @Override public void run() {while(true) {try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}System.out.println(&thread 1:& + Thread.currentThread().getName());} } public static void main(String[] args) {ThreadTest1 thread = new ThreadTest1 ();thread.start(); }//main end}
可以写成内部类的形式,new Thread(){@Override run(...)}.start();
[b]实现Runnable接口并重写run方法[/b] public class ThreadTest2 implements Runnable { @Override public void run() {while(true) {try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}System.out.println(&thread 3:& + Thread.currentThread().getName());} } public static void main(String[] args) {ThreadTest2 thread3 = new ThreadTest2();Thread thread = new Thread(thread3);thread.start(); }//main end}
可以写成内部类的形式,new Thread(new Runnable(){@Override run(...)}).start();
线程终止当调用Thread类的start()方法时,将会创建一个线程,这时刚创建的线程处于就绪状态(可运行状态),并没有运行,处于就绪状态的线程就可以等JVM调度。当JVM调度该线程时,该线程进入运行状态,即执行Thread类的run()方法中的内容。run()方法执行完,线程结束,线程进入死亡状态。这是线程自然终止的过程,我们也可以通过Thread类提供的一些方法来终止线程。
[b]interrupt()/isInterrupted()/interrupted()方法介绍[/b]stop()方法没有做任何的清除操作就粗暴终止线程,释放该线程所持有的对象锁(下文将介绍),受该对象锁保护的其它对象对其他线程可见,因此具有不安全性。
suspend()方法会使目标线程会停下来,但仍然持有在这之前获得的对象锁,对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。
终上所述,不建议使用stop()方法和suspend()方法来终止线程,通常我们通过interrupt()方法来终止处于阻塞状态和运行状态的线程。
需要注意的是,interrupt()方法不会中断一个正在运行的线程,仅仅是将线程的中断标记设为true,当调用了阻塞方法之后,线程会不断监听中断标志,如果为true,则产生一个InterruptedException异常,将InterruptedException放在catch中就能终止线程。
isInterrupted()方法可以返回中断标记,常用循环判断条件。
interrupted()方法测试当前线程是否已经中断,线程的中断标志由该方法清除。interrupted()除了返回中断标记之外,它还会清除中断标记。
[b]interrupt()用法[/b]看下面例子
public class ThreadInterruptedTest extends Thread { @Override public void run() {try { int i = 0; while(!isInterrupted()) {i ++ ;Thread.sleep(1000);System.out.println(this.getName() + & is looping,i=& + i); }} catch (InterruptedException e) { System.out.println(this.getName() + & catch InterruptedException,state:& + this.getState());e.printStackTrace();} } public static void main(String[] args) throws Exception { ThreadInterruptedTest thread = new ThreadInterruptedTest();System.out.println(thread.getName() + & state:& + thread.getState());thread.start();System.out.println(thread.getName() + & state:& + thread.getState());Thread.sleep(5000); System.out.println(&flag: & + thread.isInterrupted()); //发出中断指令thread.interrupt(); System.out.println(&flag: & + thread.isInterrupted()); System.out.println(thread.getName() + & state:& + thread.getState());System.out.println(thread.interrupted()); }}
Thread-0 state:NEWThread-0 state:RUNNABLEThread-0 is looping,i=1Thread-0 is looping,i=2Thread-0 is looping,i=3Thread-0 is looping,i=4flag: falseflag: trueThread-0 state:TIMED_WAITINGThread-0 catch InterruptedException,state:RUNNABLEfalsejava.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.itpsc.thread.ThreadInterruptedTest.run(ThreadInterruptedTest.java:11)
从运行结果可以看出,调用interrupt() 发出中断指令前,中断标志位false,发出中断指令后中断标志位为true,而调用interrupted()方法后则中断标志被清除。从发出的异常来看,是在一个sleep interrupted,且发出异常后线程被唤醒,以便线程能从异常中正常退出。
线程运行状态图线程从创建到终止可能会经历各种状态。在java.lang.Thread.State类的源码中,可以看到线程有以下几种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。各种状态的转换如下:
Thread Thread-0 dec 1 from count,count remain 99Thread Thread-1 inc 2 from count,count remain 101Thread Thread-0 dec 1 from count,count remain 100Thread Thread-1 inc 2 from count,count remain 102Thread Thread-0 dec 1 from count,count remain 101Thread Thread-1 inc 2 from count,count remain 103Thread Thread-0 dec 1 from count,count remain 102Thread Thread-1 inc 2 from count,count remain 104Thread Thread-0 dec 1 from count,count remain 103Thread Thread-1 inc 2 from count,count remain 105
线程共享变量,只要对要对共享变量进行修改的代码进行同步即可。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)相关信息,包括
的信息,所有Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
Internationalc#线程如何释放-CSDN论坛
c#线程如何释放
c#线程如何释放,是不是线程执行完了就自动释放了,有没有类似Delphi里面的destory来释放线程
是。据我所知没有释放线程一说。
只有Thread.Abort(),Thread.Join().
System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。他有很多的方法,在这里我们将就比较常用和重要的方法做一下介绍:
Thread.Start():启动线程的执行;
Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
Thread.Resume():继续已挂起的线程;
Thread.Interrupt():中止处于&Wait或者Sleep或者Join&线程状态的线程;
Thread.Join():阻塞调用线程,直到某个线程终止时为止
Thread.Sleep():将当前线程阻塞指定的毫秒数;
Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。
通过调用Thread.Sleep,Thread.Suspend或者Thread.Join可以暂停/阻塞线程。调用Sleep()和Suspend()方法意味着线程将不再得到CPU时间。这两种暂停线程的方法是有区别的,Sleep()使得线程立即停止执行,但是在调用Suspend()方法之前,公共语言运行时必须到达一个安全点。一个线程不能对另外一个线程调用Sleep()方法,但是可以调用Suspend()方法使得另外一个线程暂停执行。对已经挂起的线程调用Thread.Resume()方法会使其继续执行。不管使用多少次Suspend()方法来阻塞一个线程,只需一次调用Resume()方法就可以使得线程继续执行。已经终止的和还没有开始执行的线程都不能使用挂起。Thread.Sleep(int&x)使线程阻塞x毫秒。只有当该线程是被其他的线程通过调用Thread.Interrupt()或者Thread.Abort()方法,才能被唤醒。如果对处于阻塞状态的线程调用Thread.Interrupt()方法将使线程状态改变,但是会抛出ThreadInterupptedException异常,你可以捕获这个异常并且做出处理,也可以忽略这个异常而让运行时终止线程。在一定的等待时间之内,Thread.Interrupt()和Thread.Abort()都可以立即唤醒一个线程。
我的一个多线程程序运行一段时间后出错,说:“未将对象引用设置到对象的实例“
请高手指点一二,
出错部分的代码贴出来看看萨
还有我的这个程序开始运行CPU占用0%-2%,等运行3个小时后CPU占用20%左右,运行40小时候70左右
以后就这样了,这是为什么呢。
很可能你的那个线程已经abort
但是你还是引用了它
或着那个线程根本就没Start
两个线程互相调用,不停的运行下去(先不考虑如何停止他们)可以吗。
C#的线程为什么不用释放
回复

我要回帖

更多关于 如何终止线程 的文章

 

随机推荐