-2

Im learnign о ciclycbarrier и им пытаются создать небольшое приложение. Конструктор мое приложение является продолжением:Почему мой cyclicBarrier имеет значение NULL?

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 (внутри Run моей задачи) заканчивается, и его время, чтобы сделать 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

ответ

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

Вы правы! Спасибо вам!! –

2

Поскольку вы создаете локальную переменную cb в FileDownloader конструктора, но вы передаете неинициализированную this.cb к Task конструктора.

Смежные вопросы