Java再学习——停止一个正在运行的线程
关于这个问题,先了解一下Thread类方法中被废弃的那些方法。suspend(), resume(),stop()/stop(Throwable obj),destroy()
首先,stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了,没必要去看了。我们只需瞧瞧suspend(), resume(), stop()这三个就行了;
suspend()——让当前线程暂停执行
resume()——让当前线程恢复执行
当调用suspend()的时候,线程并没有释放对象,因此当多线程的时候,如果其他线程要用到某个被suspend的线程占用的对象,就必须要等到它被resume()才可以,而这个过程就极易出现死锁。
所以,they are deprecated!
而stop()是最不应该的,因为你都不知道它的状态就stop()了,释放所有能释放的锁,而且如果run方法存在同步,还不一定能stop~正反方向,这个方法都不适合。
备注:对于废弃的方法本身了解就可以,更多还是要去分析废弃的原因,如果你喜欢进阶的话~
关于停止一个正在运行的线程,官方建议设置变量去关闭。形同如下:
public class APP { public static void main(String[] args) throws Exception {
class MyThread extends Thread {
boolean flag = true; @Override
public void run() {
while (flag) {
// do something
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I'm running!");
}
System.out.println("I'm dead!");
} public void stopThread() {
flag = false;
}
}
MyThread thread = new MyThread();
thread.start();
Thread.sleep(3000);
thread.stopThread();
}
}
也就是通过设置变量来关闭线程,当然如果你就是执行完一次,那当然就没必要设置变量了,因为这种线程都没必要单独处理停止行为。
其次,这个所说是变量但是这个变量设置还是有很多巧妙的地方,比如下面这中类型:
public class APP { public static void main(String[] args) throws Exception {
class MyThread extends Thread {
boolean isRunning = true; @Override
public void run() {
while (isRunning) {
// do something
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
isRunning = false;
}
System.out.println("I'm running!");
}
System.out.println("I'm dead!");
}
}
MyThread thread = new MyThread();
thread.start();
Thread.sleep(3000);
thread.interrupt();
}
}
基本就是这样操作了~
Java再学习——停止一个正在运行的线程的更多相关文章
- java并发:中断一个正在运行的线程
要使任务和线程能安全可靠地停止,并不是一件很容易的事情,java没有提供任何机制来安全地终止线程,那么我们该怎么办呢? 下面我们先来了解一下java中的中断机制: java中断机制是一种协作机制,也就 ...
- 【Java面试】如何中断一个正在运行的线程?
一个去京东面试的工作了5年的粉丝来找我说: Mic老师,你说并发编程很重要,果然我今天又挂在一道并发编程的面试题上了. 我问他问题是什么,他说:"如何中断一个正在运行中的线程?". ...
- 如何停止一个正在运行的java线程
与此问题相关的内容主要涉及三部分:已废弃的Thread.stop().迷惑的thread.interrupt系列.最佳实践Shared Variable. 已废弃的Thread.stop() @Dep ...
- java如何正确停止一个线程
Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的in ...
- Java再学习——随机面试题
1.final, finally, finalize的区别 final—是修饰符,可以修饰变量.方法和类. final类不能再派生出新的子类即不可当父类: final变量必须在声明时给定初值或在构造方 ...
- Java 如何正确停止一个线程
自己在做实验性小项目的时候,发现自己遇到一个问题:如何控制线程的"死亡"? 首先,如何开启一个线程呢? 最简单的代码: public class Main { public sta ...
- Java再学习——栈(stack)和堆(heap)
一.内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们 ...
- Java再学习——关于ConcurrentHashMap
ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制. 1,在并发方面, ConcurrentHashMap提供了好得多的并发性.多个读操作几 ...
- Java并发学习之二——获取和设置线程信息
本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息可以帮助我们辨别每个线程.知道它的一些信息 ID:每一个线程的独特标示: Name:线程的名称: Prio ...
随机推荐
- html5 canvas防微博旋转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 无线网WEP的安全测试及防范
650) this.width=650;" border="0" alt="" src="http://img1.51cto.com/att ...
- 轻松学习Linux之内核编译
欢迎大家给我投票: http://2010blog.51cto.com/350944 650) this.width=650;" onclick='window.open("h ...
- CentOS安装配置VSFTP服务器
{:toc} 前言 本文用最简单的方式创建FTP服务,即创建一个大家都可以访问的目录,没有涉及到各种权限限制. 创建目录 在安装配置ftp之前,首先创建一个目录,用来做ftp根目录.我创建的是/hom ...
- Java反射机制(Class类的使用)
1:通过无参构造实例化对象 package cn.itcast; /* * 通过无参构造实例化对象 * 通过Class类本身实例化对象,使用newInstance方法 * 需要注意的是:实例化类中存在 ...
- Eclipse设置、调优、使用
eclipse调优 一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善. 加快启动速度 1. ...
- C#调用webService的几种方法
转自: WebClient 用法小结 http://www.cnblogs.com/hfliyi/archive/2012/08/21/2649892.html http://www.cnblogs. ...
- php获取GET方式传入的全部变量名称与值:foreach用法
$count = count($_GET); $i = 0; foreach ($_GET as $key => $value) { if ($i == $count - 1) { $str . ...
- StringUtils 字符串工具类
package com.thinkgem.jeesite.common.utils; import java.io.File; import java.io.IOException; import j ...
- github命令
git push origin master //把本地源码库push到Github上 git pull origin master //从Github上pull到本地源码库