为什么我的cyclicBarrier为null?

时间:2016-05-09 11:40:43

标签: java multithreading concurrency java.util.concurrent cyclicbarrier

我学会了关于ciclycbarrier和我试图创建一个小应用程序。我的应用程序的构造函数如下:

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();
    }

}

在构造函数中,我创建了我的Cyclicbarrier,设置了maxDownload编号和一个新的Runnable。之后,y创建我的所有线程设置任务(设置循环障碍。任务实现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)

和调试我可以看到我的任务中的循环障碍(障碍)总是为空,但cb不是。

可能是什么问题?enter image description here

2 个答案:

答案 0 :(得分:2)

由于您在cb构造函数中创建了本地FileDownloader变量,但您已将未初始化的this.cb传递给Task构造函数。

答案 1 :(得分: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

要注意。