java多线程编程:java高级多线程编程(一)--有关线程的停止问题来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
多线程是java个优势java使得员可以很方便进行多线程开发获得更好性能
有关多线程概念以及般多线程编程比如如何以及为何实现runnable接口为何stop会被Deprecated掉等等这个请看matrix的前多线程编程基础或者sunjava文档
有关多线程编程有几点这里要提到:
1既然stop是不被推荐那么我们如何停止个线程呢?直接kill吗?在这里笔者整理总结种比较通用也比较稳定思路方法:
threadtest extend Thread{
//skip some code..
boolean runflag=true;
public synchronized void stopthread
{
runflag=false;
}
public synchronized boolean getrunflag
{
runflag;
}
public void run {
runflag=true;
try {
while (getrunflag) {
code1;
code2;
//put your code here
}
}
}
catch (IOException e) {
e.prStackTrace;
}
.out.prln(this.getClass.getName+" stopped");
}
//skip some code..
}
这样每当需要停止该线程时只需stopthread即可
这里有两点需要注意:
1)我们用了个同步思路方法getrunflag来得到当前状态为什么用这个思路方法而不是直接使用while(runflag)呢?
这个是在java多线程模型中有个公共对象存储区但是每个对象都有自己私有备份当个线程改变了状态jvm并不能保证这个线程改变过变量即时更新公共对象存储区状态可能(可能性不大)造成问题
所以建议有好设计习惯采用同步思路方法来获得当前runflag值
2)还有点特别是涉及网络多线程如果发生了网络阻塞(在while循环里面发生)那么即使runflag状态比如改变成false由于被阻塞线程用这种思路方法是永远都不会被停止
举个例子:比如上面如果code1是段网络程式如果在code1发生了阻塞阻塞意义就是得不到请求
资源在无限期等待这个时候runflag状态变化对while循环是起不了作用线程不会被停止
笔者曾经参和多个涉及到获取网络资源java程式经常遇到网络阻塞引起线程问题
如果你程式可能涉及到网络阻塞或者有可能发生某种消息接受阻塞那么请不要用这种思路方法来停止线程具体思路方法请看笔者另外片文章:高级多线程编程( 2)-多线程中监控和超时问题
0
相关文章
读者评论
发表评论 |