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怎么传进来的可以不用纠结)
解决方案 »
- 在线等,ssh的分页查询jsp页面到底怎么写才能显示出查询结果
- js制作弹出窗口后三秒钟自动关闭
- 发现hibernate中关于load和get方法的一个小问题,和大家一起讨论
- 从oracle一个表中导出10万条记录,写入excel中慢,如何优化hibernate
- 当程序写好了时,怎么把程序做成软件,也就是exe文件,和配置服务器什么的。
- 如果你是高手,你進來!!!!!!!!!!!1
- 关于使用Jetty服务器断开网线就报错的问题
- 真伤自尊了,!
- 上海-月薪6000~15000 招聘Java 工程师
- tomcat上面项目运行正常,weblogic下面出现•There is no Action mapped for namespace [/] and acti
- java ee网站发布的问题
- Java多线程面试题求开解
public void run() {
synchronized (key) {
system.out.prinln(myparam_);
}
}
synchronized(this){}同步块试了下不好用
ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊
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();
}
}
}
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
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个一样的?
ThreadLocal好像蛮符合要求的,只是没用过。应该怎么使用啊如果就按照你贴上来的代码来看,每次都会输出不同的myparam_的。ThreadLocal可以看下:http://blog.csdn.net/newcman/article/details/6729208
你的代码和你说的这个问题一点关系都没有啊。。
你自己上面说的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应该加到哪里
你的代码和你说的这个问题一点关系都没有啊。。
你自己上面说的ThreadLocal是对的,可以解决这个问题。
不会啊。网上看不懂。
ThreadLocal加到代码哪里才对啊,我定义的ThreadLocal每次get出来的都是null
你的代码和你说的这个问题一点关系都没有啊。。
你自己上面说的ThreadLocal是对的,可以解决这个问题。
不会啊。网上看不懂。
ThreadLocal加到代码哪里才对啊,我定义的ThreadLocal每次get出来的都是null我的代码跟多线程没关系吗? 我有一段相似的代码,是打印pdf的。总有pdf打不出来,好像就是因为传进来的pdf的打印路径在使用的时候被别的线程修改了,那个内部线程类不是有个修改全局变量的构造方法吗?
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();
}
}
}
消费线程|变量|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就可以了,希望能帮到你。