2015-07-31 20 views
5

Trong lớp B làm thế nào tôi có thể biết công việc của các chủ đề được hoàn thành? Trong các thuộc tính sau, một số nhân viên đang chạy. Trong lớp B, tôi cần phải biết nếu nhân viên đã làm xong chưa?Làm thế nào tôi có thể biết các công việc chủ đề được thực hiện?

public class A implements InitializingBean{ 
    public void method1(){ 
     ... 
    }  
    @Override 
    public void afterPropertiesSet() throws Exception { 
     System.out.print("test after properties set");  
     // send threads to executorService 
     ExecutorService executorService = Executors 
       .newFixedThreadPool(4); 
     for (int i = 0; i < 4; i++) { 
      Worker worker = new Worker();  
      executorService.submit(worker); 
     } 
    } 
} 
public class Worker implements Callable<Void>{ 
    @Override  
    public void call(){ 
    ... 
    } 
} 
public class B{ 
    public void methodB(){ 
     A a = new A(); 
    a.method1(); 
    ///Here How can i know the job of the workers are finished? 
    } 
} 
+0

Bạn có thể đặt nhật ký hoặc bất kỳ thông báo cảnh báo nào ở cuối chuỗi .... – Cool7

+0

Bạn có thể triển khai giao diện gọi lại mà chuỗi sẽ gọi phương thức, thông báo cho bất kỳ trình nghe nào về hoàn thành công việc. Tương tự như những gì 'Service' làm với các ứng dụng JavaFX. Bạn có thể thực hiện giao diện này trong lớp bạn muốn nghe để hoàn thành và chuỗi sẽ gọi phương thức khi công việc của nó được thực hiện. –

+0

Bạn có thể sử dụng mẫu nghe/gọi lại, theo đó nhiệm vụ chuỗi thông báo cho người nghe đã đăng ký khi nó hoàn thành – ControlAltDel

Trả lời

4

Sử dụng một mẫu người nghe/gọi lại để có kết thúc báo cáo thread để một người biết lắng nghe. ví dụ đơn giản này sẽ hiển thị quá trình:

public interface ThreadCompleteListener { 
    void workComplete(); 
} 

public class NotifyingThread extends Thread { 
    private Set<ThreadCompleteListener> listeners; 
    // setter method(s) for adding/removing listeners to go here 

    @Override 
    public void run() { 
     // do stuff 
     notifyListeners(); 
    } 

    private void notifyListeners() { 
     for (ThreadCompleteListener listener : listeners) { 
      listener.workComplete(); // notify the listening class 
     } 
    } 
} 

trong lớp nghe của bạn:

NotifyingThread t = new NotifyingThread(); 
t.addListener(new ThreadCompleteListener() { 
    void workComplete() { 
     // do something 
    } 
}); 

t.start(); 
2

Nói chung, nó thường là hữu ích hơn để được thông báo qua một callback khi công việc hoàn tất. Tuy nhiên, vì những người khác đã đăng câu trả lời theo mô hình đó, tôi sẽ đăng một giải pháp đơn giản cho phép bạn thăm dò ý kiến ​​và hỏi liệu các công việc có hoàn thành hay không, trong trường hợp điều này phù hợp với nhu cầu của ứng dụng của bạn tốt hơn.

public static interface InitializingBean{ 
    public void afterPropertiesSet() throws Exception; 
} 

public static class A implements InitializingBean{ 

    private List<Future<Void>> submittedJobs = Collections.synchronizedList(new ArrayList<Future<Void>>()); 

    public void method1(){ 
     //do stuff 
    }  
    @Override 
    public void afterPropertiesSet() throws Exception { 
        System.out.print("test after properties set");  
     // send threads to executorService 
     ExecutorService executorService = Executors 
       .newFixedThreadPool(4); 
     synchronized (submittedJobs) {    
      for (int i = 0; i < 4; i++) { 
       Worker worker = new Worker();  
       submittedJobs.add(executorService.submit(worker)); 
      } 
     } 
    } 

    /** 
    * Allows you to poll whether all jobs are finished or not. 
    * @return 
    */ 
    public boolean areAllJobsFinished(){ 
     synchronized (submittedJobs) {    
      for(Future<Void> task : submittedJobs){ 
       if(!task.isDone()){ 
        return false; 
       } 
      } 

      return true; 
     } 
    } 
} 
public static class Worker implements Callable<Void>{ 
    @Override  
    public Void call(){ 
    //do worker job 

    return null; //to satisfy compiler that we're returning something. 
    } 
} 
public static class B{ 
    public void methodB(){ 
     A a = new A(); 
    a.method1(); 

    if(a.areAllJobsFinished()){ 
     System.out.println("Congrats, everything is done!"); 
    } else { 
     System.out.println("There's still some work being done :-("); 
    } 
    } 
} 
+0

được chỉnh sửa vì tôi nhận ra rằng tôi đã quên phần chính của mã nơi bạn thêm công việc vào danh sách công việc đã gửi :-) – augray

0

Nếu bạn muốn đợi trong chuỗi đó bắt đầu ExecutorService, bạn có thể thực sự sử dụng phương thức awaitTermination.

Vào cuối bạn afterPropertiesSet phương pháp, bạn nên thêm:

executorService.shutdown(); 

Sau này sau đó bạn thêm:

executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS) 

Điều này làm cho thread để chờ đợi cho tất cả các nhiệm vụ của ExecutorService việc phải làm và sau đó tiếp tục. Vì vậy, hãy đặt bất kỳ mã nào bạn muốn thực thi sau khi cuộc gọi chờ đợiĐiều chỉnh.

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