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

如何在Java线程上使用共享内存?,java,multithreading,class,multiprocessing,shared-memory,Java,Multithreading,Class,Multiprocessing,Shared Memory,我正在用Java实现一个多线程程序,其中每个thread都属于类节点扩展thread的类型 所有这些类都会生成某些值,这些值将被其他类使用 对于main而言,很容易从生成的线程中获取值,但如何从线程本身中获取其他线程上的值 //Start the threads from a list of objects for (int i = 0; i < lnode.size(); i++) { lnode.get(i).start(); } //从对象列表启动线程 对于(inti=0

我正在用Java实现一个多线程程序,其中每个
thread
都属于
类节点扩展thread
的类型

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

对于
main
而言,很容易从生成的
线程
中获取值,但如何从
线程
本身中获取其他
线程
上的值

//Start the threads from a list of objects
for (int i = 0; i < lnode.size(); i++) { 
    lnode.get(i).start();
}
//从对象列表启动线程
对于(inti=0;i

谢谢

听起来你在找一个新的,但是如果没有更多的细节,就很难说了

您希望在这些线程之间共享什么样的数据,以及它们需要如何共享这些数据


顺便说一句-通常认为实现
Runnable
比扩展
Thread

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

如果您执行以下操作:

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();
MyThreadRunnable类实现Runnable{
列出字符串;
MyThreadRunnable(列表字符串){
this.strings=字符串;
}
公开募捐{
添加(getName());
}
}
// ...
List sharedStrings=新建ArrayList();
线程t1=新线程(新的MyThreadRunnable(sharedStrings));
线程t2=新线程(新的MyThreadRunnable(sharedStrings));
t1.start();
t2.start();
然后
t1
t2
(相同类型的两个不同线程)将使用相同的列表,并查看从另一个线程对其所做的更改

事实上,由于我没有为了简洁而使用任何同步,这也可能会以某种不可预测的方式破坏列表并导致奇怪的错误。我强烈建议您在使用并发时研究进程同步和
java.util.concurrent
包。

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

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


您可以找到更多信息。

默认情况下,单个进程中的所有线程都共享所有内存,并且可以随时访问这些内存中的任何一个。请停止这种可怕的扩展线程而不是实现Runnable的做法。downvote:这似乎与答案完全相反。ThreadLocal不在线程之间共享,而是在一个线程内共享。问题是,“如何获取其他线程上的值?”