我们如何在使用线程时实现高效的异常处理。
我有一个主程序,可以创建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!!");
}
}
答案 0 :(得分:3)
你可以使用:
Thread#setUncaughtExceptionHandler指定在抛出异常时运行的代码(在正常程序流程之外),或者:
ExecutorService#invokeAll运行所有阻止,并检查返回的列表Future#get()投掷ExecutionException
。另一种选择是CompletionService,但这对于这么简单的案例来说有点难度。
答案 1 :(得分:0)
您可以使用try / catch阻止策略:
Thread t = new Thread() {
@Override
public void run() {
try {
//..thread code
} catch (Exception e) {
}
}
};
它很容易实现,但是如果异常,你的应用程序的主线程永远不会知道子线程内发生了什么。
更好的方法是使用ExecutorService生成线程(如FauxFaux所述)。这将允许您轻松地将有关错误的信息传递给主线程。除此之外,使用ExecutorService可以编写更少的代码。您不必在代码中管理线程,而是将其留给ExecutorService。
答案 2 :(得分:0)
我使用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();
}
}