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怎么传进来的可以不用纠结)

解决方案 »

  1.   

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

  2.   

    @Override
            public void run() {
    synchronized (key) {
    system.out.prinln(myparam_);
    }
    }
      

  3.   


    synchronized(this){}同步块试了下不好用
    ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊
      

  4.   

    第一眼看到的是你的类名开头居然是小写,太不规范了。你这代码如果穿进去的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();
    }
    }
    }
      

  5.   

    打印:
    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
      

  6.   

    这问题的重点是什么?每次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个一样的?
      

  7.   

    synchronized(this){}同步块试了下不好用
    ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊如果就按照你贴上来的代码来看,每次都会输出不同的myparam_的。ThreadLocal可以看下:http://blog.csdn.net/newcman/article/details/6729208
      

  8.   


    你的代码和你说的这个问题一点关系都没有啊。。
    你自己上面说的ThreadLocal是对的,可以解决这个问题。
      

  9.   

    能不能说说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应该加到哪里
      

  10.   


    你的代码和你说的这个问题一点关系都没有啊。。
    你自己上面说的ThreadLocal是对的,可以解决这个问题。
    不会啊。网上看不懂。
    ThreadLocal加到代码哪里才对啊,我定义的ThreadLocal每次get出来的都是null
      

  11.   


    你的代码和你说的这个问题一点关系都没有啊。。
    你自己上面说的ThreadLocal是对的,可以解决这个问题。
    不会啊。网上看不懂。
    ThreadLocal加到代码哪里才对啊,我定义的ThreadLocal每次get出来的都是null我的代码跟多线程没关系吗? 我有一段相似的代码,是打印pdf的。总有pdf打不出来,好像就是因为传进来的pdf的打印路径在使用的时候被别的线程修改了,那个内部线程类不是有个修改全局变量的构造方法吗?
      

  12.   

    给你解释下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();
            }
        }
    }
      

  13.   

    消费线程|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就可以了,希望能帮到你。