如何使用不同的值初始化每个线程

时间:2013-12-03 10:43:33

标签: java multithreading

我需要用不同的数据创建三个线程。我想要一个线程值不能影响到另一个线程值但是这里有一个线程值修改另一个线程变量值。我不知道该怎么做。

这是我的示例类,它创建三个线程并使用不同的值初始化变量。

public class One {

public void processChange(final String  userdata)
{
    Two Thread1=null,Thread2=null,Thread3=null;
    data.put("type","one");
    Thread1=new Two(data);
    Thread1.setName("one");
    Thread1.start();

    data.put("type","two");
    Thread2=new Two(data);
    Thread2.setName("two");
    Thread2.start();

    data.put("type","three");
    Thread3=new Two(data);
    Thread3.setName("three");
    Thread3.start();    


}
}

扩展线程的另一个类

 public class Two extends Thread {

JSONObject data;

public Two(JSONObject data) {
this.data=data;
}
public Two() {
}

public void run()
{
        log.debug(this.getName()+" and data is"+data.toString());
        sendData(data);
        log.debug("after running "+this.getName()+" and data is"+data.toString());  
}
 }

执行上面的代码后。 last initialize jsonObject数据值包含所有线程。 我希望每个拥有jsonOjbect数据的线程都是不同的

3 个答案:

答案 0 :(得分:0)

这样做。您需要为每个Thread创建不同的JSONObject。

JSONObject data1 = new JSONObject();
data1.put("type","one");
Thread1=new Two(data1);
Thread1.setName("one");
Thread1.start();

JSONObject data2 = new JSONObject();
data2.put("type","two");
Thread2=new Two(data2);
Thread2.setName("two");
Thread2.start();

答案 1 :(得分:0)

您正在修改传递给所有线程的相同data对象。您需要为每个线程创建新对象,否则"type"值对于所有线程已经是"three"

public void processChange(final String  userdata)
{
    Two Thread1=null,Thread2=null,Thread3=null;
    JSONObject data1 = new JSONObject(); //*** SEE NOTE
    data1.put("type","one");
    Thread1=new Two(data1);
    Thread1.setName("one");
    Thread1.start();

    JSONObject data2 = new JSONObject(); //*** SEE NOTE
    data2.put("type","two");
    Thread2=new Two(data2);
    Thread2.setName("two");
    Thread2.start();

    JSONObject data3 = new JSONObject(); //*** SEE NOTE
    data3.put("type","three");
    Thread3=new Two(data3);
    Thread3.setName("three");
    Thread3.start();    

    }
}

注意:我不确定真正的构造函数是什么。如果您使用复制构造函数(如果可用),那可能是最好的:new JSONObject(data);

答案 2 :(得分:0)

java中有一个名为ThreadLocal的类可以解决你的问题。

http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html