文档章节

启动线程以及安全终止线程

k
 karma123
发布于 2018/10/15 22:50
字数 654
阅读 12
收藏 0
JDK

启动

使用start()方法可以启动线程。

start()方法的含义是告知线程规划器线程已初始化完毕,可以分给这个线程时间片了(执行run()方法)。

安全终止线程

示例代码

import java.util.concurrent.TimeUnit;

public class Shutdown {
    public static void main(String[] args) throws Exception {
        Runner one = new Runner();
        Thread countThread = new Thread(one, "CountThread");
        countThread.start();
        // 睡眠1秒,main线程对CountThread进行中断,使CountThread能够感知中断而结束
        TimeUnit.SECONDS.sleep(1);
        countThread.interrupt();
        Runner two = new Runner();
        countThread = new Thread(two, "CountThread");
        countThread.start();
        // 睡眠1秒,main线程对Runner two进行取消,使CountThread能够感知on为false而结束
        TimeUnit.SECONDS.sleep(1);
        two.cancel();
    }

    private static class Runner implements Runnable {
        private long             i;

        private volatile boolean on = true;

        @Override
        public void run() {
            while (on && !Thread.currentThread().isInterrupted()) {
                i++;
            }
            System.out.println("Count i = " + i);
        }

        public void cancel() {
            on = false;
        }
    }
}

结果

Count i = 364902562

Count i = 239832801

分析:使用【中断操作】和【volatile修饰的停止标识变量】这两种方式都能够优雅安全地停止线程

代码中target为one时是使用interrupt(),运行中的线程(main主线程)调用线程countThread的interrupt()方法,向countThread线程打了个“招呼”,对countThread线程做了中断操作。我们看JDK源码中interrupt()方法的源码:

看注释:

// Just to set the interrupt flag

说的非常明白,对标识位进行了设置。就是将 interrupt flag 设置为true。将线程的中断标识位 interrupt flag 属性设置为了true。

所以while条件中 Thread.currentThread().isInterrupted() 返回为true。然后代码跳出了while循环。

代码中target为two时是显式地将停止标识变量on(为volatile变量)变为false,然后跳出while循环。

为何说这样停止线程的方式安全优雅?

Thread的stop()方法也可以终止线程,但是很直接暴力,而且可能会引起死锁。

所以stop()方法被被遗弃了。

使用【中断操作】和【volatile修饰的停止标识变量】的方式停止线程,使线程在终止时有机会清理资源

安全终止线程套路总结

1.run()方法中一般都有while条件。

2.将停止标识变量(最好定义为volatile变量,多线程场景下能够立马读取该变量)写入while条件。

3.显式的调用改变停止标识变量的方法,就可以安全而优雅的停止线程了。

© 著作权归作者所有

共有 人打赏支持
k
粉丝 7
博文 88
码字总数 65057
作品 0
丰台
私信 提问
Android 多线程之几个基本问题

Android中的进程和线程 Android中的一个应用程序一般就对应着一个进程,多进程的情况可以参考Android 多进程通信之几个基本问题 Android中更常见的是多线程的情况,一个应用程序中一般都有包...

xxq2dream
2018/09/28
0
0
JAVA多线程10-基础篇-线程终止

本节摘要: 介绍线程中断的原理、阻塞方法以及代码示例 一、为什么需要中断 有哪些场景我们需要中断线程?通常有以下几点: 我们希望在指定的时间内完成任务,但是任务执行时间太久,例如调用...

x_coder
2017/11/01
0
0
java多线程学习(一)

相关概念 进程:是一次程序的运行。 线程:在进程中独立运行的子任务。 使用多线程的优点:提升系统的运行效率。 如何使用多线程 2.1继承Thread类 Thread类的结构:public class Thread imp...

kakayang2011
2016/02/28
99
0
《windows核心编程系列》谈谈进程的建立和终止

第二部分:工作机理 第一章:进程 上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了。首先要给大家介绍的是进程内核对象。进程大家都不陌生,它是资源和分配的基本单位,而进程内...

长平狐
2012/10/08
99
0
ThreadPoolExecutor源码解析

阅读原文请访问我的博客 BrightLoong's Blog 一. 线程池概述 在介绍线程池之前,先说一下为什么在开发中要使用线程池,个人认为主要有一下的原因: 开发中使用线程的时候,大部分线程执行的时...

BrightLoong
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

KaliLinuxNetHunter教程下载相关资源

KaliLinuxNetHunter教程下载相关资源 当用户将刷机工具准备完后,则需要下载ROM包。ROM是ROM image(只读内存镜像)的简称,常用于手机定制系统。一般手机刷机的过程,就是将只读内存镜像(R...

大学霸
19分钟前
1
0
C# 字符串插值

字符串插值 据说是 C# 6.0 中引入的新特性. 字符串插值允许您以更简洁易读的方式将字符串拼凑在一起. 如果在字符串的左引号前添加$,则可以在字符串中的大括号里包含字符串值,如变量等. 一些示...

taadis
43分钟前
2
0
Navicat使用教程:接收MySQL/MariaDB问题通知

下载Navicat Monitor最新版本 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona ...

电池盒
44分钟前
3
0
我是怎样和Linux系统结缘并通过红帽RHCE认证的

我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#、C++之类的...

Linux就该这么学
52分钟前
5
0
hbase的web页面访问

hbase1.1版本web页面默认不开放 在hbase-site.xml中加入一下内容即可 <!-- 新增的配置 --><property><name>hbase.master.info.port</name><value>60010</value></property> 借鉴htt......

你为什么不吃药
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部