代码:

线程的阻塞是不能打断的就是被synchronized阻塞的线程。

线程的run方法是不能抛出异常的:https://www.cnblogs.com/wxqsly/p/4275067.html

钩子函数:https://my.oschina.net/u/3768341/blog/1842994

线程死掉外面是不知道发生了什么的。

如何处理?

kill -9停掉的化网络资源不会立即释放,操作系统会释放。

jvm两种模式。server模式会进行即使编译,多线程会有happend-before问题。

写一个简单的钩子函数程序,部署在虚拟机里面,直接在虚拟机里面写:

package chapter11;public class Exit {public static void main(String[] args) {Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("The application will be exit.");notifyAndRelease();}));int i = 0;while (true) {try {Thread.sleep(1_000L);System.out.println("I am  working");} catch (Throwable e) {}i++;if (i > 20) {throw new RuntimeException("Erroe");}}}public static void notifyAndRelease() {//抛出异常之后做的事System.out.println("notify to the admin.");//通知主机try {Thread.sleep(1_000);} catch (Exception e) {}System.out.println("will release reource(socket file connection)");//释放资源try {Thread.sleep(1_000);} catch (Exception e) {}System.out.println("done");//完成}
}

输出为:

javac Exit.javanohup java Exit &tail -f nohup.out

------------

在kill 的时候我们要获得一个通知。

kill用钩子也是可以的。

kill -9不可以的就真的杀掉了,钩子也没用了。

--------------------------------------------------31----------------------------------------------------

代码:

------

线程里面是抛异常不可以的,只能够捕获的。

1.

public class ThreadException {private final static int A = 10;private final static int B = 0;public static void main(String[] args) {//new Test1().test();Thread t = new Thread(() -> {try {Thread.sleep(5_000L);int result = A / B;System.out.println(result);} catch (InterruptedException e) {e.printStackTrace();}});
//        t.start();t.setUncaughtExceptionHandler((thread, e) -> {System.out.println(e);System.out.println(thread);});t.start();}
}

这个是一个内部类。

--------

2.一个有趣的实验工作不常用的:

public class Test1
{private Test2 test2 = new Test2();public void test(){test2.test();}
}
public class Test2 {public void test() {Arrays.asList(Thread.currentThread().getStackTrace()).stream().filter(e -> !e.isNativeMethod()).forEach(e -> Optional.of(e.getClassName() + ":" + e.getMethodName() + ":" + e.getLineNumber()).ifPresent(System.out::println));}
}

打印:

14 14 5等是行数。

----------------------------------------------------------32------------------------------------------------------

run方法是不能抛出异常的,这个是由方法签名决定的。

ThreadGroup:ThreadGroup----->Thread

在jvm启动的时候有一个根的ThreadGroup,其包含ThreadGroup和Thread。

代码:

打印:

public class ThreadMainGroup {public static void main(String[] args) {System.out.println(Thread.currentThread().getName());System.out.println(Thread.currentThread().getThreadGroup().getName());}
}

都是main。main也是一个线程。

public class ThreadGroupGet {public static void main(String[] args) {ThreadGroup tg1 = new ThreadGroup("TG1");Thread t1 = new Thread(tg1, "t1") {@Overridepublic void run() {while (true) {try {System.out.println(getThreadGroup().getName());System.out.println(getThreadGroup().getParent());System.out.println(getThreadGroup().getParent().activeCount());Thread.sleep(10_0000);} catch (InterruptedException e) {e.printStackTrace();}}}};t1.start();//同一个父亲的ThreadGroup tg2 = new ThreadGroup("TG2");Thread t2 = new Thread(tg2, "T2") {@Overridepublic void run() {System.out.println(">>>"+tg1.getName());Thread[] threads = new Thread[tg1.activeCount()];tg1.enumerate(threads);Arrays.asList(threads).forEach(System.out::println);}};t2.start();}
}

-----------------------------------------------------------33-------------不看了用的比较少-----------------------------------------

ThreadGroup的API:

package chapter12;import java.util.Arrays;public class ThreadGroupFatherAndSon {public static void main(String[] args) throws InterruptedException {ThreadGroup tg1 = new ThreadGroup("TG1");Thread t1 = new Thread(tg1, "t1") {@Overridepublic void run() {try {Thread.sleep(1_000);} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();ThreadGroup tg2 = new ThreadGroup(tg1, "TG2");Thread t2 = new Thread(tg2, "T2") {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();break;}}}};t2.start();System.out.println(tg1.activeCount());//输出为2System.out.println(tg1.activeGroupCount());//输出为1tg2.checkAccess();//是否可以更改 就是当前的线程是不是能改tg2tg1.destroy();//必须是不在运行的线程在group里面Thread[] ts1 = new Thread[tg1.activeCount()];tg1.enumerate(ts1);//true就是那所有的  false就是自己的 不是递归Arrays.asList(ts1).forEach(System.out::println);tg1.interrupt();//它中断了儿子什么的都中断了}
}

----

ThreadGroup要是你不显示的destory,其生命周期是比较长的。

-----

例子:destory,线程执行结束就destory线程组。

public class Destory {public static void main(String[] args) throws InterruptedException {ThreadGroup tg1 = new ThreadGroup("TG1");Thread t1 = new Thread(tg1, "t1") {@Overridepublic void run() {//while (true) {try {Thread.sleep(1_000);} catch (InterruptedException e) {e.printStackTrace();//  break;}//}}};tg1.setDaemon(false);t1.start();Thread.sleep(2_000);System.out.println(tg1.isDestroyed());//输出为true tg1.setDaemon(true);tg1.destroy();System.out.println(tg1.isDestroyed());//输出为true}
}

-----------------------------------------------------------------34------不看了用的比较少------------------------------------------------

java并发编程实战wwj----------------------第一阶段--------------31-32-33-34相关推荐

  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----------------------第二阶段-------Future框架-------21-22-23

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

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

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

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

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

最新文章

  1. android base layout - top middle bottom
  2. FFMPEG命令行处理视频进阶——高阶必读
  3. 子项目依赖和父项目冲突_实战 | maven 轻松重构项目
  4. 使用参数来防止SQL注入
  5. mysql声明declare_mysql8 参考手册--DECLARE ... CONDITION声明
  6. Flex与Java通信之HttpService方式
  7. 这不是商业互吹,是学习的宝藏
  8. ./configure --prefix
  9. 2017 Q1网络安全市场报告:未来5年,全球网络安全支出将超过1万亿美元
  10. Teradata 和Greenplum 的讨论
  11. Q96:PT(3.4):砂岩纹理(Sandstone Texture)
  12. 【MySQL】MySQL中的死锁
  13. python,PyQt5编程将qrc文件转为py文件
  14. 发票专用驱动sjz_增值税发票选择确认平台使用手册
  15. 软件工作的量化考核有办法吗?
  16. 10天背诵英文10000单词
  17. VIVO NEX 3 5G版上手评测,除99.6%的屏占比,还有什么理由入手
  18. WPF的介绍和XAML语言
  19. 关于华硕笔记本BIOS设置
  20. 华为云服务器上安装jdk和部署tomcat

热门文章

  1. CCIE认证通过率一般是多少?
  2. 主要开源WebGIS介绍、自由及开源GIS软件、组件产品
  3. textarea 聚焦后边框_如何更改textarea的边框颜色:focus
  4. ERP是什么?中小商户有必要用吗?秦丝、金蝶、管家婆哪家强?
  5. python自动化办公是什么_Python自动化办公知识点整理汇总
  6. ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”
  7. Scrum敏捷开发-开发流程(简洁粗略版)
  8. 推荐系统(9):推荐系统评测之评测方法
  9. 机器学习常见面试问题(一)
  10. PCL学习笔记(30)——法线估计normal_estimation