/**

* @FileName: ThreadTest.java

* @Description:

* @Author : xingchong

* @CreateTime: Sep 22, 2018 12:01:01 PM

* @Copyright: 超火影游 Copyright (c) 2017

* @Version: 1.0

*/

public class ThreadTest implements Runnable {

private boolean stop = false;

private Thread thread;

private int flag;

public ThreadTest(){

this.thread = new Thread(this, ThreadTest.class.getSimpleName());

this.flag = 0;

}

private String getName(){

return "["+Thread.currentThread().getName()+"] ";

}

/*

* (non-Javadoc)

*

* @see java.lang.Runnable#run()

*/

@Override

public void run() {

while(!stop){

System.out.println(this.getName() +", i am running..."+ this.flag++);

if(this.flag > 30){

break;

}

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(this.getName()+", i am end...");

}

public synchronized void start(){

this.thread.start();

}

public synchronized void stop(){

System.out.println(this.getName() +", stop the thread...");

this.stop = true;

this.thread.interrupt();//马上中断 thread 正在进行的 sleep 等操作,而让停止操作立即执行

//若没有上面interrupt()方法,会导致 thread 发呆在 sleep ,担耽时机

try {

this.thread.join();//为了现在马上转入 thread 线程,以触发this.stop引起的停止操作,而不用再让main线程抢 CPU,担耽时机

} catch (InterruptedException e) {

e.printStackTrace();

}

//若没有上面的 join()方法,会导致以下代码在停止前执行

for (int i = 0; i < 3; i++) {

System.out.println(this.getName() +"in stop ...");

}

}

public static void main(String[] args) {

ThreadTest threadTest = new ThreadTest();

threadTest.start();

for (int i = 0; i < 3; i++) {

System.out.println(threadTest.getName()+", main...." + i);

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

threadTest.stop();

System.out.println(threadTest.getName()+", main is end...");

}

}

关于java 线程的停止同时用 interrupt 和 join 的作用的更多相关文章

  1. java线程之停止线程

         在Java中有以下3种方法可以终止一个正在运行的线程:      1.使用退出标志,是线程正常退出,也就是run方法完成后线程终止.      2.使用stop方法强制终止线程,但不推荐使用 ...

  2. Java线程池停止空闲线程是否有规则呢?

    Java线程池中线程的数量超过核心线程的数量,且所有线程空闲,空闲时间超过keepAliveTime,会停止超过核心线程数量的线程,那么会保留哪些线程呢?是不是有规则呢? 测试代码: ThreadPo ...

  3. Java线程状态及 wait、sleep、join、interrupt、yield等的区别

    Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到  被中断.被拥有该对象锁的线程唤醒(notify或not ...

  4. java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

    Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...

  5. 【java线程】的wait、sleep、join、yied

    1.概述 使用Thread相对来说比较简单,没有什么成本,但是通常来说,我们使用线程基本就是覆写run方法,然后调用线程对象的start函数启动线程. 对于面试人员来说,这些都不是面试官会问到的问题, ...

  6. java 线程Thread.Sleep详解 Thread.Sleep(0)的作用(转载)

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果 ...

  7. 如何终止java线程

    http://blog.csdn.net/anhuidelinger/article/details/11746365 终止线程的三种方法 有三种方法可以使终止线程. 1.  使用退出标志,使线程正常 ...

  8. 初识java线程(Thread)

    <1>.概念问题 线程的状态:1.NEW : 没有start的线程 2.RUNNING :可运行线程,可能正在执行,也可能正在等待操作系统中的其他资源,比如cpu时间片 3.BlOCKED ...

  9. Java线程(1)

    多线程快速入门 线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以 ...

随机推荐

  1. GDI+在Delphi程序的应用 Photoshop色相饱和度明度功能

    本文用GDI+实现Photoshop色相/饱和度/明度功能,参照我的其它有关GDI+在 Delphi程序的应用的文章,代码也可供TBitmap使用. 有些人不喜欢,或者不太懂Delphi的BASM代码 ...

  2. C++之静态(static)

    一.静态数据成员与静态成员函数 二.从内存角度看静态数据成员 三.从this指针谈静态成员函数 四.注意事项 五.补充说明 1.<静态>课程评论: 静态成员是类的成员,不是对象的成员: 静 ...

  3. Hadoop搭建,上传文件时出现错误,没有到主机的路由

    解决方案:(1)从namenode主机ping其它slaves节点的主机名(注意是slaves节点的主机名),如果ping不通,原因可能是namenode节点的/etc/hosts 未配置主机名与IP ...

  4. assignment of day nine

    一.简述定义函数的三种方式 1.空函数:用于占位 2.有参函数:有参数的函数 3.无参函数:没有参数的函数 二.简述函数的返回值 1.如果函数没有返回值,默认返回None 2.函数可以通过return ...

  5. 19-MySQL-Ubuntu-数据表的查询-自关联(八)

    自关联   转自:https://blog.csdn.net/hubingzhong/article/details/81277220

  6. idea在ssm项目中引入本地的jar

    在对应的lib下,右键找到add...,即可

  7. Flutter 集成到现有iOS工程

    前沿 由于我司已经有自己的App,flutter属于技术引进的一部分,也不太可能重新启动一个项目,因此目前我们是将flutter模块形式注入我们的App之中.即:将flutter模块集成到现在有iOS ...

  8. iOS开发系列-Charles

    概述 Charles相当于一个插在服务器和客户端之间的"过滤器".当客户端向服务器发起请求的时候,先到charles进行过滤,然后charles在把最终的数据发送给服务器: 注意: ...

  9. virtualbox启动虚机报错:The VM session was closed before any attempt to power it on.

    解决方法:   image.png 点击清除即可. 或者在控制>清除保存的状态.然后重启虚机即可!

  10. thinkphp 空控制器

    空控制器的概念是指当系统找不到请求的控制器名称的时候,系统会尝试定位空控制器(EmptyController),利用这个机制我们可以用来定制错误页面和进行URL的优化. 大理石平台价格表 现在我们把前 ...