首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

多线程全局变量的有关问题

2013-11-15 
多线程全局变量的问题你自己上面说的ThreadLocal是对的,可以解决这个问题。[解决办法]引用:我的代码跟多线

多线程全局变量的问题


你自己上面说的ThreadLocal是对的,可以解决这个问题。
[解决办法]
引用:
我的代码跟多线程没关系吗? 我有一段相似的代码,是打印pdf的。总有pdf打不出来,好像就是因为传进来的pdf的打印路径在使用的时候被别的线程修改了,那个内部线程类不是有个修改全局变量的构造方法吗?

给你解释下ThreadLocal怎么用,你的打印路径应该是存在公共变量里了,ThreadLocal确实能解决你的问题,具体使用你还得根据你实际情况来。
public class TestThread extends Thread{
    A a;
    public TestThread(A a) {
        this.a = a;
    }

    public static void main(String[] args) {
        A a = new A("0");
        for(int i=0; i < 5; i++){
            Thread t = new TestThread(a);
            t.start();
        }
        System.out.println("主线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
        System.out.println("主线程
[解决办法]
变量
[解决办法]
"+a.myparam);
        new B(a).start();
        try {
            Thread.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
        System.out.println("主线程
[解决办法]
变量
[解决办法]
"+a.myparam);
    }

    public void run() {
        a.threadSession.set(a.myparam);


        for(int i=0; i < 5; i++){
            System.out.println("消费线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
            System.out.println("消费线程
[解决办法]
变量
[解决办法]
"+a.myparam);
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class A{
    ThreadLocal threadSession = new ThreadLocal();
    String myparam = "";
    public A(String myparam) {
        this.myparam = myparam;
    }
}
class B extends Thread{
    A a;
    public B(A a) {
        this.a = a;
    }
    public void run() {
        try {
            Thread.sleep(700);
            System.out.println("修改线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
            System.out.println("修改线程
[解决办法]
变量
[解决办法]
"+a.myparam);
            a.myparam = "333";
            a.threadSession.set("bbbbb");
            System.out.println("修改线程
[解决办法]
ThreadLocal
[解决办法]
"+a.threadSession.get());
            System.out.println("修改线程
[解决办法]
变量
[解决办法]
"+a.myparam);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


[解决办法]
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
主线程
[解决办法]
ThreadLocal
[解决办法]
null
主线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量


[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
0
修改线程
[解决办法]
ThreadLocal
[解决办法]
null
修改线程
[解决办法]
变量
[解决办法]
0
修改线程
[解决办法]
ThreadLocal
[解决办法]
bbbbb
修改线程
[解决办法]
变量
[解决办法]
333
主线程
[解决办法]
ThreadLocal
[解决办法]
null
主线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
------解决方案--------------------


333
消费线程
[解决办法]
ThreadLocal
[解决办法]
0
消费线程
[解决办法]
变量
[解决办法]
333

从结果可以看出对于同一个实例a,每个线程myparam变量是同一个,一个线程改变了,所有线程都会受到影响。
每个线程threadSession都不是一个,互相不受影响,set()只会影响本线程。
代码写的很不规范,请见谅。你的打印路径是因为存到a.myparam才会被改变的,放到ThreadLocal就可以了,希望能帮到你。

热点排行