-2

私はciclycbarrierと小さなアプリを作成しようとしています。私は私のCyclicBarrierを作成し、コンストラクタでなぜ私のcyclicBarrierがヌルですか?

public FileDownloader(String line, int maxDownload){ 
    this.position = 0; 
    this.line = line; 
    this.maxDownload = maxDownload; 
    this.urls = new ArrayList<String>(); 
    this.ths = new ArrayList<Thread>(); 
    this.exm = new Semaphore(1); 
    this.GenerateURLS(); 
    final CyclicBarrier cb = new CyclicBarrier(this.maxDownload, new Runnable(){ 
     @Override 
     public void run(){ 


      System.out.println("All download are finished"); 
      //Mergear cuando se termina 
      //Borrar cuando se termina 
     } 

    }); 

    for(int i=0; i<this.maxDownload;i++){ 
     ths.add(new Thread(new Task(this.cb),"Hilo"+i)); 
    } 
    for(Thread th: ths){ 
     th.start(); 
    } 

} 

、maxDownload番号と新しいRunnableを設定:私のアプリのコンストラクタは以下です。その後、すべてのスレッドがタスクを設定します(周期バリアを設定します。タスクはRunnableを実装します)。私のタスクのコードは以下です:

class Task implements Runnable{ 
    private CyclicBarrier barrier; 
    public static int position; 
    public Task(CyclicBarrier cb){ 
     this.barrier = cb; 

    } 

    public void run(){ 
     try { 

      FileDownloader.DownloadManager(); 
      this.barrier.await(); 
     } catch (InterruptedException | BrokenBarrierException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      System.out.println(e.getStackTrace()); 
     } 
    } 
} 

しかし、この方法DownloadFile(私のタスクの内部で実行)が終了したときに問題がある、とcb.awaitを行うにはその時間が、私は次のエラーを持っている:

Exception in thread "Hilo1" java.lang.NullPointerException 
    at Prac2.Task.run(FileDownloader.java:23) 
    at java.lang.Thread.run(Thread.java:745) 

私のタスクのcyclicbarrier(barrier)は常にnullですが、cbは表示されません。

何が問題になりますか?あなたはFileDownloaderコンストラクタ内のローカルcb変数を作成している、まだあなたはTaskコンストラクタに初期化されていないthis.cbを渡しているのでenter image description here

答えて

1

あなたのコードをよく見てください。

ローカル変数cbを作成します。

final CyclicBarrier cb = new CyclicBarrier(this.maxDownload, new Runnable(){ 
    @Override 
    public void run(){ 
     System.out.println("All download are finished"); 
     //Mergear cuando se termina 
     //Borrar cuando se termina 
    } 

}); 

ここでは、クラスレベルの変数にアクセスします。

for(int i=0; i<this.maxDownload;i++){ 
    ths.add(new Thread(new Task(this.cb),"Hilo"+i)); 
} 

私は、次の意味:

this.cb 

が行き届いて。

+0

あなたは正しいです!ありがとうございます!! –

関連する問題