2015-05-08 4 views
0
public class Chicks { 
    synchronized void yacks(long id) 
    { 
     for(int x = 1; x<3; x++) 
     { 
      System.out.println(id + " "); 
      Thread.yield(); 
     } 
    } 
} 
class ChickYacks implements Runnable 
{ 
    Chicks c; // No exception if I declare it as static 
    public static void main(String[] args) { 
     new ChickYacks().go(); 
    } 
    public void run() 
    { 
     c.yacks(Thread.currentThread().getId()); //Throws a Nullpointer exceptin 
    } 
    void go() 
    { 
     c = new Chicks(); 
     new Thread(new ChickYacks()).start(); 
     new Thread(new ChickYacks()).start(); 
    } 
} 

Почему он выбрасывает исключение Nullpointer в run method(). Все выглядит хорошо для меня. Когда я объявляю Chicks 'c' статичным, но я не понимаю его почему?Внедрение многопоточного экземпляра экземпляра

+1

Обратите внимание, что это не имеет ничего общего с многопоточности. Вы просто создаете объекты, забывая присвоить ненулевое значение полю этих объектов, а затем вызывать метод в этом нулевом поле. –

ответ

6

go Ваш метод присваивает ненулевое значение для «этого» экземпляр ChickYacks - но затем создает два новых экземпляров ChickYacks, каждый из которых будет иметь нулевое значение для c.

Вы могли:

  • Initialize c в конструкторе вместо этого, так что каждый экземпляр имеет ненулевое значение
  • Initialize c в поле инициализаторе
  • Initialize c в методе run()
  • Инициализировать c для новых экземпляров в методе go
  • Pass this к Thread конструктора вместо создания новых экземпляров
  • Make c статическими, так что это не имеет значения, какой экземпляр вам доступ к нему из (или даже получить доступ к ли вы его в статическом методе вместо; это будет связано с типом, а не с экземплярами)

Это не имеет ничего общего с нарезкой резьбы. Вы бы получить такой же эффект, если вы не использовали темы, только с исключением броска в оригинальной нити вместо новых нитей:

void go() 
{ 
    c = new Chicks(); 
    new ChickYacks().run(); // Bang! 
    new ChickYacks().run(); 
} 
+0

ничего себе! Джон Скит ответил на мой вопрос. Он должен быть на 100% прав :) –

+0

Кроме того, мне нравится, что вы ответили на мой вопрос, но я до сих пор этого не понимаю:/«ненулевое значение для этого« экземпляра ChickYacks »- что это значит? –

+0

@kvp: Ну, что вы не понимаете? Я расширил свой ответ. (Во второй раз - изворотливое сетевое соединение съедает первое расширение ...) –

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