日期:2014-05-18  浏览次数:20744 次

多线程全局变量的问题

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

------解决方案--------------------
引用:
Quote: 引用:

new innerThread(myparam).start();
这句放到synchronized(this){}同步块里。或者用ThreadLocal

synchronized(this){}同步块试了下不好用
ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊
如果就按照你贴上来的代码来看,每次都会输出不同的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;
    }