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线程的终止与中断的更多相关文章

  1. 【Java并发基础】Java线程的生命周期

    前言 线程是操作系统中的一个概念,支持多线程的语言都是对OS中的线程进行了封装.要学好线程,就要搞清除它的生命周期,也就是生命周期各个节点的状态转换机制.不同的开发语言对操作系统中的线程进行了不同的封 ...

  2. Java 线程的终止-interrupt

    Java线程的终止——interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种 ...

  3. 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系

    前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...

  4. Java并发指南1:并发基础与Java多线程

    本文转载自互联网,侵删 什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是 ...

  5. 【Java并发基础】Java内存模型解决有序性和可见性

    前言 解决并发编程中的可见性和有序性问题最直接的方法就是禁用CPU缓存和编译器的优化.但是,禁用这两者又会影响程序性能.于是我们要做的是按需禁用CPU缓存和编译器的优化. 如何按需禁用CPU缓存和编译 ...

  6. java 线程的终止与线程中断

    关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...

  7. java并发笔记之java线程模型

    警告⚠️:本文耗时很长,先做好心理准备 java当中的线程和操作系统的线程是什么关系? 猜想: java thread —-对应-—> OS thread Linux关于操作系统的线程控制源码: ...

  8. Java并发编程 (九) 线程调度-线程池

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 声明:实际上,在开发中并不会普遍的使用Thread,因为它具有一些弊端,对并发性能的影响比较大,如下: ...

  9. Java并发基础03. 传统线程互斥技术—synchronized

    在多个线程同时操作相同资源的时候,就会遇到并发的问题,如银行转账啊.售票系统啊等.为了避免这些问题的出现,我们可以使用synchronized关键字来解决,下面针对synchronized常见的用法做 ...

随机推荐

  1. shell 脚本实战笔记(4)--linux磁盘分区重新挂载

    背景: Hadoop的HDFS文件系统的挂载, 默认指定的文件目录是/mnt/disk{N}. 当运维人员, 不小心把磁盘挂载于其他目录, 比如/mnt/data, /mnt/disk01, /mnt ...

  2. Error: map 不是模板

    问题: 笔者在自定义的namespace中使用map的时候,出现如题所示的问题. Error: map 不是模板 解决 百思不得其解. 然后Google到一片CSDN博文的类似问题 vector不是模 ...

  3. [LeetCode&Python] Problem 575. Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...

  4. poj-1239(递推关系)好难

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  5. .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

    你可以使用临界区(Critical Section).互斥量(Mutex).信号量(Semaphores)和事件(Event)来处理线程同步.然而,在编写一些异步处理函数,尤其是还有 async 和 ...

  6. 【洛谷P1338】末日的传说

    https://www.luogu.org/problemnew/show/P1338 [题目大意:从1到n的连续自然数,求其逆序对数为m的一个字母序最小的排列.] 最开始的思路是想从逆序对数入手,然 ...

  7. hibernate连接oracle12c数据库报:java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝。(用户名/口令在oracle客户端以及cmd命令都能登入)

    报错信息: 2017-09-22 15:40:07,354 WARN [org.hibernate.cfg.SettingsFactory] - Could not obtain connection ...

  8. 数据库表结构转成设计书,PowerDesigner 表格导出为excel

    数据库中的表导入到PowerDesigner中并转为excel文档 1.打开PowerDesigner12,在菜单中按照如下方式进行操作 file->Reverse Engineer->D ...

  9. 我的nginx iis 负载均衡学习(环境搭建)

    1,下载并安装nginx 比较简单 2,进行网站的配置 我使用了我的IIS 站点中已经拥有的两个站点 3,进行nginx 的配置 配置如下: 在server 节点之前添加如下的配置: upstream ...

  10. 01.ubuntu16.06编译安装Hi3518EV200 SDK

    转载,侵删 HI3518EV200 SDK安装并编译osdr. 1.开发环境 windows10电脑 + 虚拟机14 Pro + Ubuntu16.0.4 2.拷贝并解压.将 Hi3518E_SDK_ ...