我正在用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();
}
感谢
答案 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();
然后t1
和t2
(两个不同的相同类型的线程)将使用相同的列表,并查看从其他线程所做的更改。
实际上,由于我没有使用任何同步以简洁起见,因此也可能以某种不可预测的方式破坏列表并导致奇怪的错误。我强烈建议您在使用并发时调查进程同步和java.util.concurrent
包。
答案 1 :(得分:3)
如果是同一个进程/ jvc实例的线程,则不需要“共享内存”,只需要在脚踏板内引用数据,例如通过构造函数或静态引用。 但是,如果有多个线程在该数据上写入,则需要同步/控制访问机制。
答案 2 :(得分:1)
听起来你正在寻找一个ConcurrentHashMap,但没有更多的细节,很难分辨。
您希望在这些线程之间共享什么类型的数据?他们将如何共享它?
BTW - 通常认为实施Runnable
比扩展Thread
更好。
答案 3 :(得分:-1)
您可以使用ThreadLocal分享变量。 ThreadLocal的定义如下所示:
线程本地可以被视为访问范围,就像请求一样 范围或会话范围。这是一个线程范围。您可以设置任何对象 线程本地和此对象将是特定的全局和本地 正在访问此对象的线程。
您可以找到更多信息here。