多线程实例字段实现
Multi threading instance field implementation
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 method()
中抛出空指针异常。我觉得一切都很好。当我将 Chicks 'c'
声明为静态但我不明白为什么?
您的 go
方法将非空值分配给 ChickYacks
的 "this" 实例 - 但随后创建了两个 new 实例 ChickYacks
,每个 c
.
都有一个空值
你可以:
- 改为在构造函数中初始化
c
,以便每个实例都有一个非空值
- 在字段初始化器
中初始化c
- 在
run()
方法中初始化c
- 为
go
方法中的 new 实例初始化 c
- 将
this
传递给 Thread
构造函数而不是创建新实例
- 使
c
静态化,这样无论您从哪个实例访问它都无关紧要(或者实际上您是否以静态方法访问它;它将与类型相关联而不是与实例相关联)
这真的与线程无关。如果你不使用线程,你会得到同样的效果,只是在原始线程而不是新线程中抛出异常:
void go()
{
c = new Chicks();
new ChickYacks().run(); // Bang!
new ChickYacks().run();
}
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 method()
中抛出空指针异常。我觉得一切都很好。当我将 Chicks 'c'
声明为静态但我不明白为什么?
您的 go
方法将非空值分配给 ChickYacks
的 "this" 实例 - 但随后创建了两个 new 实例 ChickYacks
,每个 c
.
你可以:
- 改为在构造函数中初始化
c
,以便每个实例都有一个非空值 - 在字段初始化器 中初始化
- 在
run()
方法中初始化c
- 为
go
方法中的 new 实例初始化c
- 将
this
传递给Thread
构造函数而不是创建新实例 - 使
c
静态化,这样无论您从哪个实例访问它都无关紧要(或者实际上您是否以静态方法访问它;它将与类型相关联而不是与实例相关联)
c
这真的与线程无关。如果你不使用线程,你会得到同样的效果,只是在原始线程而不是新线程中抛出异常:
void go()
{
c = new Chicks();
new ChickYacks().run(); // Bang!
new ChickYacks().run();
}