高并发与多线程网络学习笔记(小技巧)
创建多个线程
Stream.of("f1","f2").foreach(n->new Thread().start());
线程休眠
TimeUnit.Second.sleep()//好过Thread.sleep(),可控时间级别,增强可读性
程序中断之后主动调用的钩子函数
可以用于程序中断后释放资源
//Runtime.getRuntime(),可以获取到CPU等本机信息
Runtime.getRuntime().addShutdownHook(new Thread(){})
线程捕获run方法异常
线程自己本身无法抛出异常,所以有一些runtimeException无法捕获,如2/0
thread.setUnCaughtExceptionHandler(接口)
获取线程运行堆栈,查看调用逻辑
- 日志可以这样做,一般不常用
- 以方法为基本单位,返回当前方法的调用堆栈信息
Arrays.stream(Thread.currentThread().getStackTrace()).filter(e->!e.isNativeMethod()).forEach(
e-> System.out.println(e.getClassName()+":"+e.getMethodName()+":"+e.getLineNumber())
跳出多重循环
Outer:
while(true){
while(true){
break Outer;//就可以跳出循环到Outer的位置
}
}