0 java multithreading scjp ocpjp
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();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它会抛出一个Nullpointer异常run method().一切看起来都很好.当我宣布Chicks 'c'为静态但我不理解为什么?
您的go方法为"this"实例分配了一个非null值ChickYacks- 但随后创建了两个新实例ChickYacks,每个实例都有一个null值c.
你可以:
c而是在构造函数中初始化,以便每个实例都具有非null值c一个字段初始c在run()方法中初始化c为新的实例go方法this给Thread构造函数而不是创建新实例c静态变为无关紧要从哪个实例访问它(或者实际上是否用静态方法访问它;它将与类型相关联而不是与实例相关联)这与线程无关,真的.如果你没有使用线程,你会得到同样的效果,只是在原始线程中抛出异常而不是新线程:
void go()
{
c = new Chicks();
new ChickYacks().run(); // Bang!
new ChickYacks().run();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |