2009-03-05 70 views
6

當出現異常時,如何從不同的線程切換回主線程。當一個子線程發生異常時,我想要一個通知發送到主線程並從主線程執行一個方法。我怎樣才能做到這一點?Java - 切換回主線程?

謝謝。

信息

我打電話從我的主要方法的方法和一些計算後開始一個新的線程那裏如果你的孩子的線程是在主創建改變

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     ..... 
    } 
} 
thread.start(); 

回答

3

當子線程發生異常時,主線程將會做什麼?對於子線程中的任何錯誤,它必須是等待

您可以在子線程中建立一個UncaughtExceptionHandler,它可以引發主線程正在等待的事件。

+0

它不必等待。它可以定期輪詢隊列中的錯誤事件,如果沒有要處理的事件,則移動到其他任務。 – erickson 2009-03-05 06:36:35

+0

@eickson,是的,它不需要一直在等待,但它會在某個時刻等待。我想確保OP知道這將是一個等待/通知,Thread.start不會返回可供調用者使用的值。 – 2009-03-05 06:42:16

+0

這個方法(和我的方法)實際上並沒有在主線程上執行,它們仍然是用Thread.currentThread ==發生異常的線程完成的。不知道這對OP是否真的很重要。 – TofuBeer 2009-03-05 07:10:00

1

,你可能會導致異常彈出並在主線程中處理它。

您還可以進行一種回撥。

我還沒有試過這個我的自我。

-2

This might for you work。

public class Main 
{ 
    public static void main(final String[] argv) 
    { 
     final Main main; 

     main = new Main(); 
     main.go(); 
    } 

    public void go() 
    { 
     final Runnable runner; 
     final Thread thread; 

     runner = new Foo(this); 
     thread = new Thread(runner); 
     thread.start(); 
    } 

    public void callback() 
    { 
     System.out.println("hi!"); 
    } 
} 

class Foo 
    implements Runnable 
{ 
    private final Main main; 

    Foo(final Main m) 
    { 
     main = m; 
    } 

    public void run() 
    { 
     // try catch and handle the exception - the callback is how you notify main 
     main.callback(); 
    } 
} 
3

由於TofuBeer說,你需要提供更多的背景,然而,如果這方面是,你是一個Swing應用程序...

SwingUtilities.invokeLater(Runnable的R)可以讓你回電話上搖擺的主執行線程。

} catch (final Exception e) { 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run() { 
      //do whatever you want with the exception 
     } 
    }); 
} 
0

實現一些類應用程序的界面http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html,讓它處理線程,它產生的異常。

有關更多詳細信息,請參閱文檔。

編輯:這可能不是你想要的 - 我相信該方法將被拋出異常的線程調用。如果你想在你的主線程上執行一些方法,主線程必須以某種方式等待它。

但是,如果你只想處理這種情況的例外。想到的最好的方法是在線程內的try ... catch塊中處理異常。