java并发编程实战wwj----------------------第一阶段--------------31-32-33-34
代码:
线程的阻塞是不能打断的就是被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相关推荐
- java并发编程实战wwj----------------------第一阶段--------------35-36-37-38-39
线程一般是并发包里面的东西,我们重新写一个线程是没有必要的,我们手写线程是是为了掌握他的原理等. 线程是非常重的: 线程池为什么要有它: 线程创建要开辟虚拟机栈,释放线程要垃圾回收的. server端 ...
- java并发编程实战wwj----------------------第一阶段--------------27-28-29-30
代码:chapter9 sleep:是Thread的方法,sleep不释放锁,sleep不用synchronized,不需要被唤醒. wait:所有对象的方法,wait释放锁, 用synchroniz ...
- java并发编程实战wwj----------第二阶段-------------classloader----------------42-55
代码: 内存溢出:就是放不下了. 内存泄漏:虚拟机已经回收了但是堆内存还是一直在涨. 可以自定义classloader,可以打破双亲委派机制比如jvm. 看下上下文类加载器. 看下源码. ------ ...
- java并发编程实战wwj----------------------第一阶段--------------21-22-23-24-25-26
代码:chapter7 注意一个原则,锁是加在具体的实现的方法里面的,目的是锁方法里面的共享变量的. ---------------------------------21-------------- ...
- java并发编程实战wwj----------------------第二阶段--------------04-05--06--07-8-9-10-11
代码: wait线程放弃了cpu的执行权进入wait状态. Optional.of:https://www.cnblogs.com/baidawei/p/9443402.html 看下这个英文的解释. ...
- java并发编程实战wwj----------第三阶段-------------CompletableFuture---------------56-59
代码: 我找的博客:https://www.cnblogs.com/happyliu/archive/2018/08/12/9462703.html 第二段代码: 这里设置的是守护线程. 代码: pa ...
- java并发编程实战wwj----------------------第二阶段-------Future框架-------21-22-23
有一个问题,调用者由于被调用者的阻塞而陷入阻塞. --- 代码: --- 结构思路: FutureTask:泛型接口只有一个call方法,这个是真正的做事情的. Future:泛型接口,里面只有一个g ...
- java并发编程实战wwj----------------------第二阶段-------不可变对象-------19-20
不可变对象一定是线程安全的. 可变对象不一定是安全的,因为里面会加锁. ------------------------------------------------ servlet不是线程安全的, ...
- java并发编程实战wwj----------第三阶段-------------ConcurrentHashMap----------------73
红黑树的总结:https://www.jianshu.com/p/5dbaa6707017 链表+数组+红黑树. 首先看下node的数据结构: static class Node<K,V> ...
最新文章
- android base layout - top middle bottom
- FFMPEG命令行处理视频进阶——高阶必读
- 子项目依赖和父项目冲突_实战 | maven 轻松重构项目
- 使用参数来防止SQL注入
- mysql声明declare_mysql8 参考手册--DECLARE ... CONDITION声明
- Flex与Java通信之HttpService方式
- 这不是商业互吹,是学习的宝藏
- ./configure --prefix
- 2017 Q1网络安全市场报告:未来5年,全球网络安全支出将超过1万亿美元
- Teradata 和Greenplum 的讨论
- Q96:PT(3.4):砂岩纹理(Sandstone Texture)
- 【MySQL】MySQL中的死锁
- python,PyQt5编程将qrc文件转为py文件
- 发票专用驱动sjz_增值税发票选择确认平台使用手册
- 软件工作的量化考核有办法吗?
- 10天背诵英文10000单词
- VIVO NEX 3 5G版上手评测,除99.6%的屏占比,还有什么理由入手
- WPF的介绍和XAML语言
- 关于华硕笔记本BIOS设置
- 华为云服务器上安装jdk和部署tomcat
热门文章
- CCIE认证通过率一般是多少?
- 主要开源WebGIS介绍、自由及开源GIS软件、组件产品
- textarea 聚焦后边框_如何更改textarea的边框颜色:focus
- ERP是什么?中小商户有必要用吗?秦丝、金蝶、管家婆哪家强?
- python自动化办公是什么_Python自动化办公知识点整理汇总
- ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”
- Scrum敏捷开发-开发流程(简洁粗略版)
- 推荐系统(9):推荐系统评测之评测方法
- 机器学习常见面试问题(一)
- PCL学习笔记(30)——法线估计normal_estimation