kai*_* ho 6 java multithreading static-methods thread-safety
整个代码是:
public class ThreadLocalTest {
ThreadLocal<Integer> globalint = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
return new Integer(0);
}
};
public class MyThread implements Runnable{
Integer myi;
ThreadLocalTest mytest;
public MyThread(Integer i, ThreadLocalTest test) {
myi = i;
mytest = test;
}
@Override
public void run() {
System.out.println("I am thread:" + myi);
Integer myint = mytest.globalint.get();
System.out.println(myint);
mytest.globalint.set(myi);
}
}
public static void main(String[] args){
ThreadLocalTest test = new ThreadLocalTest();
new Thread(new MyThread(new Integer(1), test)).start();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么以下代码段:
ThreadLocalTest test=new ThreadLocalTest();
new Thread(new MyThread(new Integer(1),test)).start();
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
不能访问ThreadLocalTest类型的封闭实例.必须使用ThreadLocalTest类型的封闭实例限定分配(egxnew A(),其中x是ThreadLocalTest的实例).
核心问题是:我想在静态方法中初始化内部类.这里有两个解决方案:
将内部类作为外部类
使用外部引用如:
new Thread(test.new MyRunnable(test)).start();//Use test object to create new
seh*_*seh 22
如果将类更改MyThread
为静态,则可以消除此问题:
public static final class MyThread implements Runnable
Run Code Online (Sandbox Code Playgroud)
由于您的main()
方法是静态的,因此在不首先创建封闭类的实例的情况下,您不能依赖封闭类的非静态类型或字段.但更好的是,甚至不需要这样的访问,这是通过使有问题的类成为静态来实现的.
由于MyThread
是一个内部类,因此您必须使用以下实例访问它MyThreadTest
:
public static void main(String args[]) {
MyThreadTest test = new MyThreadTest();
new Thread(test.new MyThread(new Integer(1),test)).start();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38306 次 |
最近记录: |