举个例子:
   有一Manager对象负责对某个文件进行下载,从Manager中new出多个线程,每个线程负责对目标文件的一片进行下载,当
所有线程都把各自负责的文件片下载完成后,Manager开始调用方法将文件片组装成整个一文件,那么我想问,这里Manager
是如何监测到所有的线程都完成下载任务那一时刻??每一个线程完成任务后需要做什么才能让Manager知道它做完了?

解决方案 »

  1.   

    不要让Manager去监测所有线程,让线程去通知Mananger
      

  2.   

    设计个回调接口,线程完成就调用接口中的方法通知Manager
      

  3.   

    这好像和cpu中断机制是一种道理,线程结束以后让线程自身告诉Manager。
      

  4.   

    使用了eventbus http://eventbus.org/confluence/display/EventBus/Getting+StartedStatusEvent.java
    public StatusEvent {
       Sting statusText;
     
       public StatusEvent(String statusText) {
          this.statusText = statusText;
       }
       public String getStatusText() {
          return statusText;
       }
    }SomeSwingController.java
    EventBus.publish(new StatusEvent("Looking up data..."));
    注:可以在线程下载结束是发布一个Event/Message
    StatusBar.java
    public StatusBar extends JLabel implements EventSubscriber {
       public StatusBar() {
          EventBus.subscribe(StatusEvent.class, this);
       }
       public void onEvent(Object evt) {
          StatusEvent statusEvent = (StatusEvent)evt;
          this.setText(statusEvent.getStatusText();
       }
    }Using annotations, StatusBar.java is a bit simpler (the other files stay the same):
    public StatusBar extends JLabel {
        public StatusBar() {
            AnnotationProcessor.process(this);
        }
        @EventSubscriber(eventClass=StatusEvent.class)
        public void updateStatus(StatusEvent statusEvent) {
            this.setText(statusEvent.getStatusText();
        }
    }
      

  5.   

    各位大侠,到目前我是这样解决的
    因为java中变量是值传递,而对象是引用传递,所以考虑new一个对象出来,每个分任务线程持有它的引用,再设置一个监听线程,不断扫描此对象的数据,从而达到目的。
    我这样做不知道合适不合适