java中线程的高效异常处理

时间:2012-03-08 20:50:55

标签: java

我们如何在使用线程时实现高效的异常处理。

我有一个主程序,可以创建3个线程。我们如何处理执行线程期间抛出的异常的异常?

我们可以使用try / catch块或者uncaughtexception吗?如果是这样,请你分享一些样品。

public class MyThreadTest {

  public static void main(String[] args) {

      Thread newThread = new Thread(new ThreadWithException());

      // Add the handler to the thread object
      newThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){

          @Override
          public void uncaughtException(Thread t, Throwable e) {

           System.out.println("ERROR! An exception occurred in " + t.getName() + ". Cause: " + e.getMessage());
          }
      });

      newThread.start();
  }
}

/**
 * This thread throws a custom exception in its run method.
 */
class ThreadWithException implements Runnable {

    @Override
    public void run() {
    throw new RuntimeException("Application Specific Exception!!");
    }
}

3 个答案:

答案 0 :(得分:3)

你可以使用:

答案 1 :(得分:0)

您可以使用try / catch阻止策略:

    Thread t = new Thread() {
            @Override
            public void run() {
                try {
                    //..thread code 
                } catch (Exception e) {

                }
            }
        };

它很容易实现,但是如果异常,你的应用程序的主线程永远不会知道子线程内发生了什么。

更好的方法是使用ExecutorService生成线程(如FauxFaux所述)。这将允许您轻松地将有关错误的信息传递给主线程。除此之外,使用ExecutorService可以编写更少的代码。您不必在代码中管理线程,而是将其留给ExecutorService。

答案 2 :(得分:0)

最近,我编写了一个包含大约3个线程的程序,以便将大量数据从mysql和mongoDb填充到ElasticSearch。我分享你的代码。

我使用java.util.concurrent.Executors。

首先我有一个主要课程。它叫

public void start() throws Exception {
    this.logger.info("Main: Start the worker manually");
    schedulerThreadPool = Executors.newScheduledThreadPool(this.maxNumberOfThread);

    for (int i = 0; i < this.maxNumberOfThread; i++) {
            Worker worker = new Worker();
            long delay = i * this.sleepBetweenTaskStart;
            schedulerThreadPool.scheduleAtFixedRate(worker, delay, this.minTimeBetweenEachTask, TimeUnit.MILLISECONDS);
    }
}

Worker实现Runnable并通过下面的代码获取Thread Id this.threadId = Thread.currentThread().getId();
并尝试捕获每个工人。一切正常。

@Override
public void run() {
        try {
            do...
        } catch (Exception e) {
            e.printStackTrace();
        }
   }