多线程全局变量的问题

跳蚤图 2013-11-01 10:00:07

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怎么传进来的可以不用纠结)
...全文
229 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
随便5个字 2013-11-01
  • 打赏
  • 举报
回复
引用 4 楼 feier00 的回复:
[quote=引用 1 楼 ltp2010 的回复:]
new innerThread(myparam).start();
这句放到synchronized(this){}同步块里。或者用ThreadLocal
synchronized(this){}同步块试了下不好用 ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊[/quote]如果就按照你贴上来的代码来看,每次都会输出不同的myparam_的。ThreadLocal可以看下:http://blog.csdn.net/newcman/article/details/6729208
骑士的崛起 2013-11-01
  • 打赏
  • 举报
回复
引用 楼主 feier00 的回复:
假设连续启动ouThread好多次,每次myparam的值都不一样,怎样保证打印出的myparam_也不一样? 现在是只会打印出最后一次的值. (myparam怎么传进来的可以不用纠结)
这问题的重点是什么?每次myparam的值都不一样,打印怎么可能是一样的?逻辑有问题吧。
public class ouThread implements Runnable{
public void run() {
String myparam = "1";
new innerThread(myparam).start();
myparam = "2";
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_);
}
}
}
这个会打2个一样的?
teemai 2013-11-01
  • 打赏
  • 举报
回复
打印: 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
teemai 2013-11-01
  • 打赏
  • 举报
回复
第一眼看到的是你的类名开头居然是小写,太不规范了。 你这代码如果穿进去的myparam不同,打印出来本来就不一样啊。

public class OuThread implements Runnable {
	String myparam = ""; 
	public OuThread(String myparam) {
		this.myparam = myparam;
	}

	public void run() {
		System.out.println("ouThread myparam : " + this.myparam);
		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.println(myparam_);
		}
	}
	
	public static void main(String[] args) {
		for(int i=0; i < 10; i++){
			new OuThread("test"+i).run();
		}
	}
}
跳蚤图 2013-11-01
  • 打赏
  • 举报
回复
引用 1 楼 ltp2010 的回复:
new innerThread(myparam).start();
这句放到synchronized(this){}同步块里。或者用ThreadLocal
synchronized(this){}同步块试了下不好用 ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊
mash5_paul 2013-11-01
  • 打赏
  • 举报
回复
@Override public void run() { synchronized (key) { system.out.prinln(myparam_); } }
xianaofei 2013-11-01
  • 打赏
  • 举报
回复
你换个思路吧 用异步方法
随便5个字 2013-11-01
  • 打赏
  • 举报
回复
new innerThread(myparam).start();
这句放到synchronized(this){}同步块里。或者用ThreadLocal
骑士的崛起 2013-11-01
  • 打赏
  • 举报
回复
消费线程|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就可以了,希望能帮到你。
骑士的崛起 2013-11-01
  • 打赏
  • 举报
回复
引用 13 楼 feier00 的回复:
我的代码跟多线程没关系吗? 我有一段相似的代码,是打印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();
        }
    }
}
跳蚤图 2013-11-01
  • 打赏
  • 举报
回复
引用 12 楼 feier00 的回复:
[quote=引用 10 楼 huxiweng 的回复:] [quote=引用 9 楼 feier00 的回复:] 问题的重点就是,多线程下,对全局变量进行修改,就会影响最终的结果,怎么避免这个问题
你的代码和你说的这个问题一点关系都没有啊。。 你自己上面说的ThreadLocal是对的,可以解决这个问题。[/quote] 不会啊。。。。。。。网上看不懂。 ThreadLocal加到代码哪里才对啊,我定义的ThreadLocal每次get出来的都是null[/quote] 我的代码跟多线程没关系吗? 我有一段相似的代码,是打印pdf的。总有pdf打不出来,好像就是因为传进来的pdf的打印路径在使用的时候被别的线程修改了,那个内部线程类不是有个修改全局变量的构造方法吗?
跳蚤图 2013-11-01
  • 打赏
  • 举报
回复
引用 10 楼 huxiweng 的回复:
[quote=引用 9 楼 feier00 的回复:] 问题的重点就是,多线程下,对全局变量进行修改,就会影响最终的结果,怎么避免这个问题
你的代码和你说的这个问题一点关系都没有啊。。 你自己上面说的ThreadLocal是对的,可以解决这个问题。[/quote] 不会啊。。。。。。。网上看不懂。 ThreadLocal加到代码哪里才对啊,我定义的ThreadLocal每次get出来的都是null
跳蚤图 2013-11-01
  • 打赏
  • 举报
回复
引用 1 楼 ltp2010 的回复:
new innerThread(myparam).start();
这句放到synchronized(this){}同步块里。或者用ThreadLocal
能不能说说ThreadLocal
public class ouThread implements Runnable{
public void run() {
new innerThread(myparam).start();
}
 
private final class innerThread extends Thread {
private myBean myparam_;
 
private innerThread (myBean myparam) {
            myparam_ = myparam;
        }
@Override
        public void run() {
system.out.prinln(myparam_.getLocal() + "123");
}
}
}
这段代码ThreadLocal应该加到哪里
teemai 2013-11-01
  • 打赏
  • 举报
回复
引用 9 楼 feier00 的回复:
问题的重点就是,多线程下,对全局变量进行修改,就会影响最终的结果,怎么避免这个问题
你的代码和你说的这个问题一点关系都没有啊。。 你自己上面说的ThreadLocal是对的,可以解决这个问题。
跳蚤图 2013-11-01
  • 打赏
  • 举报
回复
问题的重点就是,多线程下,对全局变量进行修改,就会影响最终的结果,怎么避免这个问题

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧