2009-03-05 38 views
6

Làm cách nào tôi có thể chuyển về chủ đề chính từ một chuỗi khác khi có ngoại lệ. Khi một ngoại lệ được nâng lên trên một chủ đề con, tôi muốn một thông báo được gửi đến luồng chính và thực hiện một phương thức từ luồng chính. Tôi có thể làm cái này như thế nào?Java - chuyển về chủ đề chính?

Cảm ơn.

thông tin bổ sung

Tôi gọi một phương thức từ phương pháp chính của tôi và bắt đầu một chủ đề mới ở đó sau khi một số tính toán và thay đổi

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

Trả lời

3

Khi ngoại lệ xảy ra trong chuỗi con, chuỗi chính sẽ làm gì? Nó sẽ phải là chờ cho bất kỳ lỗi nào trong một chuỗi con.

Bạn có thể thiết lập UncaughtExceptionHandler trong chuỗi con, có thể tăng sự kiện mà chuỗi chính đang chờ.

+0

Nó không phải chờ đợi. Nó có thể thăm dò định kỳ một hàng đợi cho một sự kiện lỗi, chuyển sang các nhiệm vụ khác nếu không có sự kiện nào được xử lý. – erickson

+0

@eickson, có, nó không cần phải chờ đợi mọi lúc, nhưng nó sẽ phải đợi ở một thời điểm nào đó. Tôi muốn chắc chắn rằng OP hiểu điều này sẽ phải chờ đợi/thông báo, rằng Thread.start không trả lại một giá trị có thể được sử dụng bởi người gọi. –

+0

Phương thức này (và phương thức của tôi) không thực sự được thực thi trên luồng chính, chúng vẫn được thực hiện với Thread.currentThread == thread nơi ngoại lệ xảy ra. Không chắc chắn nếu điều đó thực sự quan trọng đối với OP. – TofuBeer

1

Nếu sợi con của bạn đã được tạo ra trong chính bạn có thể để ngoại lệ bật lên và xử lý nó trên chuỗi chính.

Bạn cũng có thể đặt một loại gọi lại.

Tôi chưa tự thử điều này.

-2

Điều này có thể phù hợp với bạn.

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(); 
    } 
} 
+1

Hoàn toàn bò. Lớp học! = Chủ đề. Bạn không thông báo cho bất kỳ chủ đề nào khác trong mã của mình. – Bombe

+0

Đúng, và tôi đã hỏi anh ta câu hỏi về ngữ cảnh nhiều hơn (nhưng không bao giờ có một câu trả lời có thể sử dụng được). Đoạn mã trên cho phép bạn thông báo cho Chính rằng đã xảy ra sự cố. Lưu ý rằng tôi đã nói nó _might_ làm việc cho anh ta - không thể nói chắc chắn vì những gì anh ta không thể (AFAIK) – TofuBeer

+0

Câu hỏi nêu rõ mong muốn gọi một cái gì đó trên chủ đề chính ... không phải là lớp "chính". Ví dụ mã này không thực hiện điều đó. – Jason

3

Như TofuBeer nói rằng bạn cần phải cung cấp bối cảnh nhiều hơn, tuy nhiên nếu bối cảnh đó là bạn là một ứng dụng đu ...

SwingUtilities.invokeLater (Runnable r) cho phép bạn gọi lại vào Swing chủ đề thực hiện chính.

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

Có, cách bạn thực hiện cuộc gọi lại phụ thuộc rất nhiều vào cách chương trình đang chạy. – TofuBeer

0

Thực hiện giao diện http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html trong một số lớp ứng dụng của bạn và để nó xử lý chuỗi và ngoại lệ.

Xem tài liệu để biết thêm chi tiết.

EDIT: Điều này có lẽ không phải là những gì bạn muốn - Tôi tin rằng phương pháp sẽ được gọi bởi chủ đề vừa ném ngoại lệ. Nếu bạn muốn một số phương thức được thực thi trên luồng chính của bạn (trong ngữ cảnh của nó), thì luồng chính sẽ phải đợi nó bằng cách nào đó.

Nhưng nếu bạn chỉ muốn xử lý ngoại lệ đó là một trường hợp. Cách tiếp cận tốt nhất, suy nghĩ, sẽ là để xử lý các trường hợp ngoại lệ trong một thử ... bắt khối bên trong chủ đề của bạn.