如何在Java线程上使用共享内存?

时间:2012-12-12 00:03:12

标签: java multithreading class multiprocessing shared-memory

我正在用Java实现一个多线程程序,其中每个thread的类型为class Node extends Thread

所有这些类都会生成某些值,这些值将被其他类使用。

对于main,很容易从生成的threads获取值,但是从threads本身,我如何获取其他threads上的值?

//Start the threads from a list of objects
for (int i = 0; i < lnode.size(); i++) { 
    lnode.get(i).start();
}

感谢

4 个答案:

答案 0 :(得分:4)

如果您执行以下操作:

class MyThreadRunnable implements Runnable {
    List<String> strings;

    MyThreadRunnable(List<String> strings) {
        this.strings = strings;
    }

    public void run() {
        strings.add(getName());
    }
}

// ...

List<String> sharedStrings = new ArrayList<String>();
Thread t1 = new Thread(new MyThreadRunnable(sharedStrings));
Thread t2 = new Thread(new MyThreadRunnable(sharedStrings));

t1.start();
t2.start();

然后t1t2(两个不同的相同类型的线程)将使用相同的列表,并查看从其他线程所做的更改。

实际上,由于我没有使用任何同步以简洁起见,因此也可能以某种不可预测的方式破坏列表并导致奇怪的错误。我强烈建议您在使用并发时调查进程同步和java.util.concurrent包。

答案 1 :(得分:3)

如果是同一个进程/ jvc实例的线程,则不需要“共享内存”,只需要在脚踏板内引用数据,例如通过构造函数或静态引用。 但是,如果有多个线程在该数据上写入,则需要同步/控制访问机制。

答案 2 :(得分:1)

听起来你正在寻找一个ConcurrentHashMap,但没有更多的细节,很难分辨。

您希望在这些线程之间共享什么类型的数据?他们将如何共享它?

BTW - 通常认为实施Runnable比扩展Thread更好。

答案 3 :(得分:-1)

您可以使用ThreadLocal分享变量。 ThreadLocal的定义如下所示:

  

线程本地可以被视为访问范围,就像请求一样   范围或会话范围。这是一个线程范围。您可以设置任何对象   线程本地和此对象将是特定的全局和本地   正在访问此对象的线程。

您可以找到更多信息here