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编程思想。设计思想便是创建线程工厂、任务以及我们心学习的异常处理器。然后根据并发编程的基本步骤(即定义任务、定义线程、将异常处理器绑定到线程以及驱动任务)来驱动我们定义的任务。

  • 相关阅读:
    文档中心 FetchURL Sina App Engine
    GroovyHelp使用指南 蛟龍居 BlogJava
    北京个人ADSL和企业ADSL有什么区别啊?
    手动编译cppserv0.1.99 @ apache2.2
    漫谈Web Service工作原理及.NET平台的实现机制
    Servlet与模板模式那些事
    [跟着hsp步步学习系统]oracle培训学习集锦全360度扫描(5)
    诺基亚死于大数据时代 上海唯一旗舰店关门
    苹果iPad强于分销渠道:平板领域将继续强势
    用友放弃野蛮生长战略 转型平台软件商
  • 原文地址:https://www.cnblogs.com/JaydenRansom/p/5533027.html
Copyright © 2011-2022 走看看