java高级多线程编程--关于线程的停止问题
关于多线程的概念以及一般的多线程编程,比如如何以及为何实现runnable接口,为何stop()会被Deprecated掉等等,这个请看matrix之前的多线程编程基础或者sun的java文档。
关于多线程编程,有几点这里要提到的:
1。既然stop()是不被推荐的,那么我们如何停止一个线程呢?直接kill吗?在这里,笔者总结一种比较通用也比较稳定的方法:
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");
}
//skip some code..
}
这样,每当需要停止该线程时,只需调用stopthread()即可。
这里有两点需要注意:
1)我们用了一个同步方法getrunflag()来得到当前的状态,为什么用这个方法而不是直接使用while(runflag)呢?
这个是因为在java的多线程模型中,有一个公共的对象存储区,但是每个对象都有自己的私有备份,当一个线程改变了状态,jvm并不能保证这个线程改变过的变量即时更新公共对象存储区的状态,可能(可能性不大)造成问题。
所以建议有好的设计习惯,采用同步方法来获得当前的runflag值。
2)还有一点,特别是涉及网络的多线程,如果发生了网络阻塞(在while循环里面发生),那么,即使runflag状态比如改变成false,由于程序被阻塞,线程用这种方法是永远都不会被停止的。
举个例子:比如上面的程序,如果code1是一段网络程式,如果在code1发生了阻塞,阻塞的意义就是得不到请求的
资源,在无限期等待,这个时候,runflag状态的变化对while循环是起不了作用的,线程不会被停止。
笔者曾经参与多个涉及到获取网络资源的java程式,经常遇到因为网络的阻塞引起的线程问题。
如果你的程式可能涉及到网络阻塞,或者有可能发生某种消息接受的阻塞。那么,请不要用这种方法来停止线程。具体方法请看笔者另外一片文章:高级多线程编程(二)-多线程中的监控与超时问题。
转载于:https://www.cnblogs.com/springMVC/archive/2008/01/30/2204583.html
java高级多线程编程--关于线程的停止问题相关推荐
- java高级-多线程编程
2019独角兽企业重金招聘Python工程师标准>>> 一.进程和线程 在java语言中最大的特点就是支持多线程的开发(也是为数不多支持多线程开发的语言),如果对多线程没有一个全面而 ...
- 用10086客服热线理解Java高级多线程之线程池
Java高级多线程之线程池 客服热线案例 引入线程池 1.线程的概念 2.线程池的作用: 获取线程池 1.常用的线程池接口和类 2.代码案例 Callable接口 1.概念简述 2.应用场景 3.方法 ...
- C#多线程编程实例 线程与窗体交互
C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form{//声明线程数组Thread[] workThreads = new Thread[10 ...
- 多线程编程、线程同步|安全和线程通信
多线程编程 多线程的优势 线程在程序中是独立的.并发的执行流,与分隔的进程相比,进程中的线程之间的隔离程度要小.他们共享内存.文件句柄和其他每个进程应有的状态. 因为线程的划分尺度小于进程,使得多线程 ...
- 多线程编程之三——线程间通讯
七.线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而 ...
- 多线程编程(2): 线程的创建、启动、挂起和退出
python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...
- 多线程编程:线程死锁的原因以及解决方法
多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的. 属于临界资源的硬件有打印机. ...
- 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业
西工大16春<JAVA高级网络编程>平时作业 7 o& [9 w ^# D Z一.单选题:[25道,总分:100分]5 z# ?* Z! M% M1 h4 R# n. D+ a ...
- Python多线程编程之线程子类化
Python多线程编程之线程子类化 基本思路 Threading模块简介 **MyThread**主要代码 实例 所有代码 运行结果 基本思路 导入Threading模块下的Thread类,将其子类化 ...
- 课工场-JAVA高级特性编程及实战第1章练习题3答案参考
JAVA高级特性编程及实战第1章练习题3答案参考~ 本人菜鸟,一章章地学, 本想在网上搜一下然后对下答案的, 没找着~ 本着虔诚的心,把自己做的贴出来~ 运行结果是了出来了,过程不知道是否正确 欢迎大 ...
最新文章
- eplan文本怎么换行_EPLAN几个使用的小技巧,非常有用
- Android支付接入(五):机锋网
- ASP.NET AJAX 1.0 发布
- Asp.Net Core 缓存的使用(译)
- java final 变量 回收_在Java中将final用于变量会改善垃圾回收吗?
- __dopostback的用法
- PHP-代码审计-SQL注入
- [Stardust]星尘配置中心
- 微软XAML Studio - WPF, UWP, Xamarin等技术开发者的福音
- 二分查找算法java
- 互联网架构设计中的poll和push
- 【TO DO!】二分查找各种情况大总结
- 怎样停止魅族系统的推送服务器,实测可行!如何关闭魅族flyme系统的自带应用推送-魅蓝屏蔽设置...
- 简单易用的运动控制卡(八):直线插补和手轮运动
- 把电脑做成服务器系统,把电脑做成云盘服务器
- Ann Rheum Dis | 华科韩金祥/宁康等发现微生物失调和代谢紊乱在类风湿关节炎中的作用...
- 机器人Ameca挣脱“灵魂”枷锁觉醒 邪魅一笑瞬间令人恐怖
- 什么蓝绿部署(BlueGreenDeployment) ?
- windows切换窗口,取消edge窗口为多个
- SaaS企业如何巧用「组织力」来构建自身持续增长的根基?
热门文章
- android UI进阶之布局的优化
- 163网站顶部展出的大幅广告
- 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)
- [读码时间] 自定义右键菜单
- 关于sharepoint2013的SPUtility.GetGenericSetupPath()方法过期解决办法
- ByteBuffer分散和聚集的应用场景
- selenium java maven testNg环境搭建
- RouteOS 频繁自启
- [微软官网] SQLSERVER 执行页面还原
- 微信小程序scroll-view横向滚动