6

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

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

因为main从 generated 中获取值很容易threads,但是从其threads自身内部,我怎样才能获取 other 上的值threads

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

谢谢

4

4 回答 4

5

如果您执行以下操作:

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();

那么t1and t2(两个相同类型的不同线程)都将使用相同的列表,并查看另一个线程对其所做的更改。

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

于 2012-12-12T00:35:58.010 回答
3

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

于 2012-12-12T00:12:14.720 回答
1

听起来您正在寻找ConcurrentHashMap,但如果没有更多细节,就很难说清楚。

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

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

于 2012-12-12T00:09:42.793 回答
-1

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

Thread Local 可以被认为是一个访问范围,就像一个请求范围或会话范围。这是一个线程范围。您可以在 Thread Local 中设置任何对象,并且该对象对于访问该对象的特定线程将是全局的和本地的。

您可以在此处找到更多信息。

于 2012-12-12T09:22:31.127 回答