代码:charapter6

1.开关的方式,逻辑关闭,不关闭就在thread一直执行。

public class ThreadCloseGraceful {private static class Worker extends Thread {private volatile boolean start = true;@Overridepublic void run() {while (start) {//}System.out.println("停止");}public void shutdown() {this.start = false;}}public static void main(String[] args) {Worker worker = new Worker();worker.start();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}worker.shutdown();}
}

2.打断的方式

package one.chapter6.stopThread;/**************************************** @author:Alex Wang* @Date:2017/2/19 QQ:532500648* QQ交流群:286081824***************************************/
public class ThreadCloseGraceful2 {private static class Worker extends Thread {@Overridepublic void run() {while (true) {System.out.println(123);if (Thread.interrupted()){System.out.println("打断");break;}}//-------------可以执行下main的逻辑//-------------//-------------}}public static void main(String[] args) {Worker worker = new Worker();worker.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}worker.interrupt();}
}

这样也可以

或者:

---

有一个问题,假设我们没有判断interrupted的机会呢?也不能判断flag,此时以上的两个方法都不可以了。

线程的状态:cnblogs.com/soulmatesjc/p/11213884.html

代码:这个真的是太重要了。

package chapter6;public class ThreadService {private Thread executeThread;private boolean finished = false;public void execute(Runnable task) {executeThread = new Thread() {// 调用我我就启动一个线程@Overridepublic void run() {Thread runner = new Thread(task);// run方法创建一个守护线程runner.setDaemon(true);runner.start();try {runner.join();//这里是为了什么?executeThread起来了执行到start()就结束了,可能守护线程还没来得及执行呢。join下,知直到runner执行死掉为止。 守护线程执行完了 才会finish。finished = true;} catch (InterruptedException e) {e.printStackTrace();System.out.println("all over");}}};executeThread.start();}public void shutdown(long mills) {long currentTime = System.currentTimeMillis();while (!finished) {if ((System.currentTimeMillis() - currentTime) >= mills) {System.out.println("任务超时,需要结束他!");executeThread.interrupt();break;}try {//没有执行结束也没有超时executeThread.sleep(1);} catch (InterruptedException e) {System.out.println("执行线程被打断!");break;}}finished = false;}
}
package chapter6;public class ThreadCloseForce {public static void main(String[] args) {ThreadService service = new ThreadService();long start = System.currentTimeMillis();service.execute(() -> {//load a very heavy resource.while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.print(123);}
//            try {
//                Thread.sleep(5000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }//假设5秒搞定了});service.shutdown(10000);long end = System.currentTimeMillis();System.out.println(end - start);}
}

线程中断:https://blog.csdn.net/u014543872/article/details/90549240

https://blog.csdn.net/u014543872/article/details/90549240

---------------------16-----17----------优雅的停止线程------------------

代码:chapter7

index是499

三个线程都是进入这个位置:

进入了箭头位置。

解决:

 synchronized (MONITOR) {if (index > MAX)break;try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + " 的号码是:" + (index++));}

------------------------------18------------------------线程安全----------------

synchronized到底是什么东西呢?

public class SynchronizedTest {private final static Object LOCK = new Object();public static void main(String[] args) {Runnable runnable = () -> {synchronized (LOCK) {try {Thread.sleep(200_000);} catch (InterruptedException e) {e.printStackTrace();}}};Thread t1 = new Thread(runnable);Thread t2 = new Thread(runnable);Thread t3 = new Thread(runnable);t1.start();t2.start();t3.start();}
}

共享数据去串行化去运行。

-----------------------------19----20------------synchronized--------------------

java并发编程实战wwj----------------------第一阶段--------------16-17-18-19-20相关推荐

  1. java并发编程实战wwj----------------------第一阶段--------------35-36-37-38-39

    线程一般是并发包里面的东西,我们重新写一个线程是没有必要的,我们手写线程是是为了掌握他的原理等. 线程是非常重的: 线程池为什么要有它: 线程创建要开辟虚拟机栈,释放线程要垃圾回收的. server端 ...

  2. java并发编程实战wwj----------------------第一阶段--------------27-28-29-30

    代码:chapter9 sleep:是Thread的方法,sleep不释放锁,sleep不用synchronized,不需要被唤醒. wait:所有对象的方法,wait释放锁, 用synchroniz ...

  3. java并发编程实战wwj----------第二阶段-------------classloader----------------42-55

    代码: 内存溢出:就是放不下了. 内存泄漏:虚拟机已经回收了但是堆内存还是一直在涨. 可以自定义classloader,可以打破双亲委派机制比如jvm. 看下上下文类加载器. 看下源码. ------ ...

  4. java并发编程实战wwj----------------------第一阶段--------------21-22-23-24-25-26

    代码:chapter7 注意一个原则,锁是加在具体的实现的方法里面的,目的是锁方法里面的共享变量的. ---------------------------------21-------------- ...

  5. java并发编程实战wwj----------------------第二阶段--------------04-05--06--07-8-9-10-11

    代码: wait线程放弃了cpu的执行权进入wait状态. Optional.of:https://www.cnblogs.com/baidawei/p/9443402.html 看下这个英文的解释. ...

  6. java并发编程实战wwj----------第三阶段-------------CompletableFuture---------------56-59

    代码: 我找的博客:https://www.cnblogs.com/happyliu/archive/2018/08/12/9462703.html 第二段代码: 这里设置的是守护线程. 代码: pa ...

  7. java并发编程实战wwj----------------------第一阶段--------------31-32-33-34

    代码: 线程的阻塞是不能打断的就是被synchronized阻塞的线程. 线程的run方法是不能抛出异常的:https://www.cnblogs.com/wxqsly/p/4275067.html ...

  8. java并发编程实战wwj----------------------第二阶段-------Future框架-------21-22-23

    有一个问题,调用者由于被调用者的阻塞而陷入阻塞. --- 代码: --- 结构思路: FutureTask:泛型接口只有一个call方法,这个是真正的做事情的. Future:泛型接口,里面只有一个g ...

  9. java并发编程实战wwj----------------------第二阶段-------不可变对象-------19-20

    不可变对象一定是线程安全的. 可变对象不一定是安全的,因为里面会加锁. ------------------------------------------------ servlet不是线程安全的, ...

  10. java并发编程实战wwj----------第三阶段-------------ConcurrentHashMap----------------73

    红黑树的总结:https://www.jianshu.com/p/5dbaa6707017 链表+数组+红黑树. 首先看下node的数据结构: static class Node<K,V> ...

最新文章

  1. java设计模式简述
  2. Android中实现一个简单的逐帧动画(附代码下载)
  3. 关于xmpp协议发送消息,登录认证SSL报错的问题
  4. Truncate a table
  5. java 栈空间_初学JAVA——栈空间堆空间的理解
  6. H264--4--H264编码[7]
  7. 统计每个url访问的topN用户以及访问次数(sql)
  8. 联想ThinkPad E431禁用触摸板功能
  9. 试图将一个数学定理证明到最底层的数哲原理...
  10. 苹果笔记本访问服务器共享文件夹,mac查看win7共享文件怎么操作_mac如何访问win7共享文件夹-win7之家...
  11. 凉茶配方案终审 加多宝赔偿近2亿元
  12. Cisco WLC 基础配置
  13. Kubernetes -K8S安装部署及SpringCloud应用
  14. css33d图片轮播_手把手教你用纯css3实现轮播图效果实例
  15. @Profile注解详解
  16. 华为路由器 单臂路由
  17. 环信群列表 php,一行代码实现群聊头像(用环信仿微信群聊头像)
  18. 数据结构与算法实验题 9.8 转移炸弹
  19. win10麦克风说话没声音_电脑录屏,真的没那么麻烦
  20. 趣味编程:从字符串中提取信息

热门文章

  1. Dinic算法 (优化)
  2. Eclipse中new一个对象之后自动补齐快捷键
  3. C++ 技术资料(大视野网络收集) 1
  4. 【自考必看】《信息资源管理》信息化规划与组织,第2章
  5. 【Excel】三秒钟将表格内数据累加
  6. Excel最常用的函数
  7. 华硕启动修复无法自动修复此计算机怎么办,华硕电脑无法启动,自动也修复不了怎么办...
  8. java教师和学生类的继承代码_Java用继承和实现完成学生,教师和家长三个类
  9. SAP BOM的操作
  10. 关于videojs视频加载重试