Java多线程与并发04: Thread Additional Capabilities

非捕获异常的处理

 

当线程中抛出异常的时候,一般抛出并打印stacktrace:

Java多线程与并发04: Thread Additional Capabilities_第1张图片

抛出异常:

 

我们可以自定义未捕获异常处理器:

Java多线程与并发04: Thread Additional Capabilities_第2张图片

当出现未捕获异常,会按照定义的UncaughtExceptionHandler去处理异常。

当然,也可以为其设置默认的未捕获异常处理器,一般设置过未捕获异常处理器后,默认的处理器将被覆盖。

Java多线程与并发04: Thread Additional Capabilities_第3张图片

 

ThreadLocal

 

我们有这样的一个场景,需要将一些数据与线程绑定,例如用户id。我们可以使用局部变量,但是维护起来比较麻烦。我们也可以使用成员变量,但是需要解决同步问题,那么ThreadLocal就解决了这样的问题。

让我们先来看看它的魔力所在:

Java多线程与并发04: Thread Additional Capabilities_第4张图片

这里我们定义了一个静态的ThreadLocal变量。使用volatile是为了线程可见性。

我们看到,在run方法里,我们并没有使用同步代码块,直接set和get了变量的值,但是程序按照我们期望的结果结束了。

 

实际上,我们可以把它当作一个多值变量来看,对于不同的线程,里面的值是不一样的,底层的实现也是以Thread为Map的键,线程对应的值是Map的值进行处理的,也就是为不同的线程单独维护了一个不同的值,解决了我们使用同步代码维护成员变量进行存储数据的麻烦。

 

可继承的ThreadLocal

 

Java多线程与并发04: Thread Additional Capabilities_第5张图片

这里使用了InheritableThreadLocal来实现从父线程向子线程的传递。

 

定时任务

 

使用TimerTask和Timer来创建定时任务:

Java多线程与并发04: Thread Additional Capabilities_第6张图片

定义TimerTask,重写run方法,然后使用Timer包装,设置延时启动时间。

 

定义重复任务:

Java多线程与并发04: Thread Additional Capabilities_第7张图片

使用第二和第三个参数设定线程延时执行和执行周期。

 

 

你可能感兴趣的:(多线程与并发)