Stop停止线程:

使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰。

public class StopThread extends Thread{
private int i = 0;
@Override
public void run() {
try {
while(true) {
i++;
System.out.println("i= " + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Stop thread. Interrupted status: " + this.isInterrupted());
e.printStackTrace();
} catch (Error e){
System.out.println("Enter error. Interrupted status: " + this.isInterrupted());
e.printStackTrace();
}
}
} public class ThreadRunMain {
public static void main(String[] args) {
testStopThread();
} public static void testStopThread(){
try {
StopThread st = new StopThread();
st.start();
Thread.sleep(5000);
st.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

运行结果:

stop()方法已经被作废,因为如果暴力让线程停止可能会使一些清理性的工作得不到完成。其次,可能会造成数据不一致的问题。如下例:

public class SynchronizedObject {
private String username = "a";
private String password = "aa"; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} synchronized public void printString(String username, String password){
try {
this.username = username;
Thread.sleep(100000);
this.password = password;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public class StopThreadIssue extends Thread{
private SynchronizedObject object; public StopThreadIssue(SynchronizedObject object) {
super();
this.object = object;
} @Override
public void run() {
object.printString("b", "aa");
}
} public class ThreadRunMain {
public static void main(String[] args) {
testStopThreadIssue();
} public static void testStopThreadIssue(){
try {
SynchronizedObject object = new SynchronizedObject();
StopThreadIssue sti = new StopThreadIssue(object);
sti.start();
Thread.sleep(500);
sti.stop();
System.out.println(object.getUsername() + " " + object.getPassword());
} catch (InterruptedException e) {
e.printStackTrace();
} }
}

运行结果:

我们期望的结果应该是:b bb,可是由于强制停止,导致 this.password = password; 没有执行。显然stop()在功能上具有缺陷,所以不建议在程序中使用stop()方法。

Java 学习笔记之 Stop停止线程的更多相关文章

  1. Java 学习笔记之 Return停止线程

    Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...

  2. Java 学习笔记之 Sleep停止线程

    Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...

  3. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  4. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  5. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  6. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. 20145330第六周《Java学习笔记》

    20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...

  9. 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理

    1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

随机推荐

  1. CF EDU 1101D GCD Counting 树形DP + 质因子分解

    CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000&l ...

  2. 洛谷P1372 又是毕业季I+数学

    P1372 又是毕业季I 题意:在1-n中找到k个数,使得这k个数的最大公因数最大: 思路,题解: 因为两个数成倍数关系时,它们的最大公因数是两数中的较小数,也就是相对来说最大公因数较大 返回题目,这 ...

  3. codeforces1076 A.B.C.D.E

    1076A 1076B 1076C 1076D 1076D A. Minimizing the String  You are given a string s consisting of n low ...

  4. "ANDROID" 支持的KEYCODE

      例子: adb shell input text keyevent 4 0 -->  "KEYCODE_UNKNOWN" 1 -->  "KEYCODE_ ...

  5. 携程PMO--小罗说敏捷之WIP限制在制品

    转自本人运营的公众号“ 携程技术中心PMO”(ID:cso_pmo)         WIP是什么?   WIP(work in progress)指的就是工作中心在制品区.在经过部分制程之后,还没有 ...

  6. 使用Spring Boot和RxJava的构建响应式REST API

    我不打算解释什么是响应式编程,也不解释为什么要使用它.我希望你已经在其他地方了解过,如果没有,你可以使用Google去搜索它.在本文中,我将告诉您如何使用专门针对Spring Boot和RxJava的 ...

  7. jumper-server-资源管理

    https://cloud.tencent.com/developer/article/1460469 此链接是百度搜索的 , 比较详细 https://www.cnblogs.com/zsl-fin ...

  8. 字符串之————图文讲解字符串排序(LSD、MSD)

    本篇文章围绕字符串排序的核心思想,通过图示例子和代码分析的方式讲解了两个经典的字符串排序方法,内容很详细,完整代码放在文章的最后. 一.键索引计数法 在一般排序中,都要用里面的元素不断比较,而字符串这 ...

  9. 学习方法分享:为何一年半就能拿到大厂 offer

    毕竟是聊聊曾经,放一张大学课堂上灵光一现,手写的一个我曾经一直使用的网名 前言 原文地址:Nealyang/personalBlog 讲真,的确是运气,才有机会进大厂.也没想到,那篇一年半工作经验试水 ...

  10. Java线程池的拒绝策略

    一.简介 jdk1.5 版本新增了JUC并发编程包,极大的简化了传统的多线程开发.前面文章中介绍了线程池的使用,链接地址:https://www.cnblogs.com/eric-fang/p/900 ...