并发基础(九) java线程的终止与中断
1、简单了解一下:为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?
suspend 、resume、stop方法分别完成了线程的暂停、恢复、终止的工作。不建议使用原因:是因为这三个方法带来的副作用,如suspend( )方法,调用后,线程就会一直占用资源睡眠,直到调用resume( )恢复后,才可以运行。这样很容易引发死锁。同样,stop( )方法在终结一个线程时不会保证线程的资源正常释放,因此会导致程序可能工作在不确定的状态下。
线程的暂停、恢复操作可以用 等待/通知 机制来替代。但线程的终止就要用户去实现了。
详细可参考:http://bjzhkuang.iteye.com/blog/1748396
2、如何优雅安全地终止线程
终止一个线程 本质上就是线程间的通信交互的过程。因此,线程间的通信方式:共享变量、流、中断都可以用来实现终止线程的机制。最常用的方式便是“中断”;
下面的例子是:除了中断,还可利用boolean变量来控制是否需要终止线程;
public class ThreadTest{
public static void main(String[] args) throws InterruptedException {
MyTask taskOne = new MyTask();
Thread threadOne = new Thread(taskOne,"threadOne");
threadOne.start();
TimeUnit.MILLISECONDS.sleep(500);
threadOne.interrupt();
MyTask taskTwo = new MyTask();
Thread threadTwo = new Thread(taskTwo,"threadTwo");
threadTwo.start();
TimeUnit.MILLISECONDS.sleep(500);
taskTwo.cancel();
}
private static class MyTask implements Runnable{
//要加上volatile 修饰符,保证内存的可见性,及时更新变量值
private volatile boolean on = true;
private long i;
@Override
public void run() {
//调用cancel、或者中断都可以终止线程
while(on && !Thread.currentThread().isInterrupted()){
i++;
}
System.out.println("线程"+Thread.currentThread().getName()+" Count i = "+i);
}
public void cancel(){
on = false;
}
}
}
运行结果:
线程threadOne Count i = 239418320
线程threadTwo Count i = 235374425
并发基础(九) java线程的终止与中断的更多相关文章
- 【Java并发基础】Java线程的生命周期
前言 线程是操作系统中的一个概念,支持多线程的语言都是对OS中的线程进行了封装.要学好线程,就要搞清除它的生命周期,也就是生命周期各个节点的状态转换机制.不同的开发语言对操作系统中的线程进行了不同的封 ...
- Java 线程的终止-interrupt
Java线程的终止——interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种 ...
- 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系
前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...
- Java并发指南1:并发基础与Java多线程
本文转载自互联网,侵删 什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是 ...
- 【Java并发基础】Java内存模型解决有序性和可见性
前言 解决并发编程中的可见性和有序性问题最直接的方法就是禁用CPU缓存和编译器的优化.但是,禁用这两者又会影响程序性能.于是我们要做的是按需禁用CPU缓存和编译器的优化. 如何按需禁用CPU缓存和编译 ...
- java 线程的终止与线程中断
关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...
- java并发笔记之java线程模型
警告⚠️:本文耗时很长,先做好心理准备 java当中的线程和操作系统的线程是什么关系? 猜想: java thread —-对应-—> OS thread Linux关于操作系统的线程控制源码: ...
- Java并发编程 (九) 线程调度-线程池
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 声明:实际上,在开发中并不会普遍的使用Thread,因为它具有一些弊端,对并发性能的影响比较大,如下: ...
- Java并发基础03. 传统线程互斥技术—synchronized
在多个线程同时操作相同资源的时候,就会遇到并发的问题,如银行转账啊.售票系统啊等.为了避免这些问题的出现,我们可以使用synchronized关键字来解决,下面针对synchronized常见的用法做 ...
随机推荐
- ADC复用重映射
- mac 常用开发软件列表
toolbox app jetbrains系开发工具箱,包含了phpstorm idea等开发工具 Postman 接口调试工具,有插件版和单独的app两种.类似paw Sublime 文本编辑器,类 ...
- Spring整合struts的配置文件存放问题
只使用Spring的时候,我把applicationContext.xml是放在项目的src路径下的,这样使用ClassPathXmlApplicationContext很方便嘛 整合了struts之 ...
- NSObject之二
前面一章我们整理了NSObject类,这一章我们来看看NSObject协议的内容. NSObject协议提供了一组方法作为Objective-C对象的基础.其实我们对照一个NSObject类和NSOb ...
- HTML第二课——css【2】
请关注公众号:自动化测试实战 现在继续上一节课的内容,看下面代码: <!DOCTYPE html><html><head> <meta charset= ...
- Hadoop全分布模式操作
http://blog.csdn.net/wangloveall/article/details/20767161 摘要:介绍Hadoop全分布模式操作,实现真正意义上的集群架构. 关键词:Hadoo ...
- windows 版 nginx 运行错误的一些解决方法
1. 关于文件夹的中文的问题. 错误的截图如下: 看得到这个 failed (1113: No mapping for the Unicode character exists in the targ ...
- tomcat源码阅读之部署器
我们知道web应用是用Context实例表示的,而Context是部署到Host实例中的,因此tomcat的部署器是关联的Host实例.Context实例可以用WAR文件部署,也可以把整个web应用的 ...
- hybrid app 知识点
WebView能加载显示网页,可以将其视为一个浏览器. Android系统中,叫做 WebView ios系统中,新版是 WKWebView,旧版是 UIWebView Native App 和 We ...
- asp.net如何使用cookie(创建、保存、读取)
Cookie的用法也和ASP中差不多.比如我们建立一个名为aspcn,值为大众的cookie HttpCookie cookie = new HttpCookie("aspcn") ...