私は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
を渡しているので
あなたは正しいです!ありがとうございます!! –