多线程全局变量的问题
public class ouThread implements Runnable{
public void run() {
new innerThread(myparam).start();
}
private final class innerThread extends Thread {
private String myparam_;
private innerThread (String myparam) {
myparam_ = myparam;
}
@Override
public void run() {
system.out.prinln(myparam_);
}
}
}
假设连续启动ouThread好多次,每次myparam的值都不一样,怎样保证打印出的myparam_也不一样?
现在是只会打印出最后一次的值.
(myparam怎么传进来的可以不用纠结)
------解决方案--------------------new innerThread(myparam).start();
这句放到synchronized(this){}同步块里。或者用ThreadLocal
------解决方案-------------------- 你换个思路吧 用异步方法
------解决方案--------------------@Override
public void run() {
synchronized (key) {
system.out.prinln(myparam_);
}
}
------解决方案--------------------打印:
ouThread myparam : test0
ouThread myparam : test1
test0
ouThread myparam : test2
test1
ouThread myparam : test3
ouThread myparam : test4
test3
test2
ouThread myparam : test5
test4
ouThread myparam : test6
test5
ouThread myparam : test7
ouThread myparam : test8
test7
test6
ouThread myparam : test9
test8
test9
------解决方案--------------------如果就按照你贴上来的代码来看,每次都会输出不同的myparam_的。ThreadLocal可以看下:http://blog.csdn.net/newcman/article/details/6729208
------解决方案--------------------问题的重点就是,多线程下,对全局变量进行修改,就会影响最终的结果,怎么避免这个问题
你的代码和你说的这个问题一点关系都没有啊。。
你自己上面说的ThreadLocal是对的,可以解决这个问题。
------解决方案--------------------我的代码跟多线程没关系吗? 我有一段相似的代码,是打印pdf的。总有pdf打不出来,好像就是因为传进来的pdf的打印路径在使用的时候被别的线程修改了,那个内部线程类不是有个修改全局变量的构造方法吗?
给你解释下ThreadLocal怎么用,你的打印路径应该是存在公共变量里了,ThreadLocal确实能解决你的问题,具体使用你还得根据你实际情况来。
public class TestThread extends Thread{
A a;
public TestThread(A a) {
this.a = a;
}