2011-10-10 30 views
12

Làm cách nào để chỉ định Status với CallMe() sử dụng isFinish() để trả về giá trị đúng?Làm thế nào để tôi nhận được giá trị trả về từ phương thức Runnable bên trong Thread trong Java?

public static boolean isFinish() 
{  
    boolean Status = false; 
    new Thread(new Runnable() 
    { 
    public void run() 
    { 
     /* This shell return true or false 
     * How do you keep it in Status 
     */ 
     CallMe(); 
    } 
    }).start(); 

    /* How can i get the true or false exactly from CallMe? here */ 
    return Status; 
} 

public static boolean CallMe() 
{ 
    /* some heavy loads ... */ 
    return true; 
} 
+3

Tại sao nên sử dụng luồng? Khởi đầu() sẽ tạo ra một luồng riêng biệt của việc thực hiện và tại thời điểm đó làFinish sẽ tiếp tục thực hiện nó. –

Trả lời

27

Có hai cách để thực hiện việc này. Đầu tiên là sử dụng kết quả tính toán trong tương lai và cách khác là có biến chia sẻ. Tôi nghĩ rằng phương pháp đầu tiên là sạch hơn nhiều so với thứ hai, nhưng đôi khi bạn cần phải đẩy các giá trị cho thread quá.

  • Sử dụng RunnableFuture.

FutureTask triển khai RunnableFuture. Vì vậy, bạn tạo nhiệm vụ đó, sau khi thực hiện, sẽ có một giá trị.

RunnableFuture f = new FutureTask(new Callable<Boolean>() { 
    // implement call 
}); 
// start the thread to execute it (you may also use an Executor) 
new Thread(f).start(); 
// get the result 
f.get(); 
  • Sử dụng một lớp giữ

Bạn tạo một lớp giữ một giá trị và chia sẻ một tham chiếu đến lớp đó. Bạn có thể tạo lớp học của riêng bạn hoặc chỉ cần sử dụng AtomicReference. Bởi lớp chủ, tôi có nghĩa là một lớp học có một thuộc tính có thể sửa đổi công khai.

// create the shared variable 
final AtomicBoolean b = new AtomicBoolean(); 
// create your thread 
Thread t = new Thread(new Runnable() { 
    public void run() { 
    // you can use b in here 
    } 
}); 
t.start(); 
// wait for the thread 
t.join(); 
b.get(); 
+0

+1, câu trả lời hay nhất –

+0

+1, giống như hai phương pháp, thực sự cảm ơn. Tôi cần phải có full-duplex cả hai đều mang lại cho tôi hướng tốt nhất. – YumYumYum

+0

cảm ơn bạn! Tôi cần điều này cho dự án đại học của tôi, bạn đã giúp rất nhiều. –

3

Bạn viết lại mã để sử dụng Callable<Boolean> và có được một Future khi tung ra Runnable.

Tương lai cho phép chuỗi khởi chạy kiểm tra chính xác giá trị đã sẵn sàng và đọc không đồng bộ. Bạn có thể làm mã hóa bằng tay, nhưng kể từ Future bây giờ là một phần của thư viện JVM chuẩn, tại sao bạn (bên ngoài một lớp lập trình)?

1

Làm việc với chủ đề thô, bạn có thể triển khai Runnable với một loại có tên và lưu trữ giá trị trong đó.

class MyRunnable implements Runnable { 
    boolean status; 

    public void run() { 
     ... 
    } 
} 

Tuy nhiên, nếu bạn đang làm việc với một chuỗi khác, bạn sẽ phải đồng bộ hóa theo một cách nào đó.

Sẽ dễ dàng hơn khi sử dụng các công cụ cấp cao hơn được cung cấp bởi phân cấp java.util.concurrent. Bạn có thể gửi một Callable đến Executor, và có được một tương lai. Bạn có thể hỏi Tương lai nếu nó được thực hiện, và nhận được kết quả. Có một số Oracle tutorial here.

Các vấn đề liên quan