java停止线程方法

class threadtest extend Thread{
	//skip some code..

	boolean runflag=true; 

	public synchronized void stopthread()
	{
		runflag=false; 
	}

	public synchronized boolean getrunflag()
	{
		return runflag; 
	} 

	public void run() {
		runflag=true;
		try {
			while (getrunflag()) {
				//code1;
				//code2; 
				//put your code here
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println(this.getClass().getName()+" stopped");
	}
}

 

这样,每当需要停止该线程时,只需调用stopthread()即可。

这里有两点需要注意:

1)我们用了一个同步方法getrunflag()来得到当前的状态,为什么用这个方法而不是直接使用while(runflag)呢?
这个是因为在java的多线程模型中,有一个公共的对象存储区,但是每个对象都有自己的私有备份,当一个线程改变了状态,jvm并不能保证这个线程改变过的变量即时更新公共对象存储区的状态,可能(可能性不大)造成问题。
所以建议有好的设计习惯,采用同步方法来获得当前的runflag值。

2)还有一点,特别是涉及网络的多线程,如果发生了网络阻塞(在while循环里面发生),那么,即使runflag状态比如改变成false,由于程序被阻塞,线程用这种方法是永远都不会被停止的。
举个例子:比如上面的程序,如果code1是一段网络程式,如果在code1发生了阻塞,阻塞的意义就是得不到请求的资源,在无限期等待,这个时候,runflag状态的变化对while循环是起不了作用的,线程不会被停止。此时,可以使用thread.interrupt()来停止线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值