Вопрос

I have a question with my code.

I have two threads running from the main method & I want to catch the exception that can occur in any of the two threads in the main method.

Future<Object> incoming=Executors.newSingleThreadExecutor().submit(new Task1(param1));
Future<Object> outgoing=Executors.newSingleThreadExecutor().submit(new Task2(param2));

Problem is that if i use Future Object & call get() method for the exception, it will block my code & i would not know if say thread 2 has finished/throws exception before thread 1.

How can i handle this elegantly instead of this?

while(!(incoming.isDone() || outgoing.isDone())){}
Это было полезно?

Решение

How about this:

A queue shared between all threads (make sure to be thread safe!),

Queue<Throwable> exceptionsToProcess;

Then, lock up your main method with a while loop:

//start threads, pass them the queue


while(true)
{
    Throwable t;
    while((t = exceptionsToProcess.poll()) == null);
    //process t
}

The exceptions will be processed in the correct order, although your run the risk of a ConcurrentModificationException if you're not careful about thread safety.

Edit: This might be a useful queue class for this purpose: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html

Другие советы

I would process the exception asynchronously if you want to deal with as soon as it happens and not wait for any other tasks to finish.

 ExecutorService oneService = ...

 oneService.submit(new Runnable() {
    public void run() {
        try {
            new Task(param1).run();
        } catch(Exception e) {
            // handle exception asynchronously
        }
    }        
 });
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top