zoukankan      html  css  js  c++  java
  • Java多线程学习(三)

    一、线程的异常(续)

    在上一篇博文中我们提到了Thread.UncaughtExceptionHandler接口,我们在日常的编写中可以通过实现这一接口来给每一个Thread对象都附着一个异常处理器,方便异常的监视。

    下面的这个例子便是如何创建异常处理器并将其附着到Thread对象上的。(该例子思路来自于Java编程思想(第四版))。

     1 import java.util.concurrent.ExecutorService;
     2 import java.util.concurrent.Executors;
     3 import java.util.concurrent.ThreadFactory;
     4 //定义任务
     5 class ExceptionTask implements Runnable {
     6     @Override
     7     public void run() {
     8         Thread thread = Thread.currentThread();
     9         System.out.println("号外号外!自定义的ExceptionTask任务正在运行");
    10         System.out.println("当前运行线程中绑定的异常处理器是:" + thread.getUncaughtExceptionHandler());
    11         throw new RuntimeException();
    12     }
    13 }
    14 //定义自定义的异常处理器
    15 class NewUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    16     public void uncaughtException(Thread thread, Throwable e) {
    17         System.out.println("捕捉到了一个RuntimeException异常哟!");
    18         
    19     }
    20 }
    21 //定义自定义的线程工厂
    22 class MyThreadFactory implements ThreadFactory {
    23     @Override
    24     public Thread newThread(Runnable task) {
    25         System.out.println("现在我们自己的MyThreadFactory要创建一个新的线程啦!");
    26         Thread thread = new Thread(task);
    27         System.out.println("名字为" + thread + "的线程被创建好啦!");
    28         thread.setUncaughtExceptionHandler(new NewUncaughtExceptionHandler());
    29         return thread;
    30     }
    31 }
    32 public class ExceptionTest {
    33     public static void main(String args[]) {
    34         ExecutorService exec = Executors.newCachedThreadPool(new MyThreadFactory());
    35         exec.execute(new ExceptionTask());
    36     }
    37 }
    38 /*Sample Output:
    39 现在我们自己的MyThreadFactory要创建一个新的线程啦!
    40 名字为Thread[Thread-0,5,main]的线程被创建好啦!
    41 号外号外!自定义的ExceptionTask任务正在运行
    42 当前运行线程中绑定的异常处理器是:thread.NewUncaughtExceptionHandler@64acfc45
    43 现在我们自己的MyThreadFactory要创建一个新的线程啦!
    44 名字为Thread[Thread-1,5,main]的线程被创建好啦!
    45 捕捉到了一个RuntimeException异常哟!
    46 
    47 
    48 
    49 */

    下面对这一例子进行解释。

    (1)   类的定义与目的

    ExceptionTask类:该类用于定义任务,由于线程的任务便是驱动任务,所以任务是多线程编程的一个核心。

    MyThreadFactory类:该类顾名思义,是创建线程的工厂。Java中给我们提供了ThreadFactory接口用于创造线程,故我们在自己的程序中设计驱动任务的线程时,可以实现这一接口,扩展定义属于自己的线程工厂。

    NewUncaughtExceptionTask类:该类实现了我们前文中出现了多次的Thread.UncaughtExceptionHandler接口,我们可以通过这种形式来设置属于自己的异常处理器,从而方便我们在程序测试或者Debug的时候更容易的找到问题所在。

    ExceptionTest类,就是我们这个样例的主类啦。在主方法中,我们按照前两篇文介绍过的方法创建线程池、线程,然后将定义好的任务放到线程池里。这一个案例就完成了。

    (2)   样例的设计思想

    此样例的思想来自于Java编程思想。设计思想便是创建线程工厂、任务以及我们心学习的异常处理器。然后根据并发编程的基本步骤(即定义任务、定义线程、将异常处理器绑定到线程以及驱动任务)来驱动我们定义的任务。

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/JaydenRansom/p/5533027.html
Copyright © 2011-2022 走看看