在特定线程之间共享变量

时间:2013-07-25 19:06:23

标签: java multithreading synchronization

我在java中面临一个问题,其中我的程序最初创建n个独立线程(ClassA),然后ClassA的每个线程使m依赖线程({ {1}})。总的来说,我现在有ClassB个帖子(m.n)。现在我想在由ClassB的特定线程创建的m个线程(ClassB)之间共享一个变量。我不能使用静态,因为所有ClassA线程都会 共享相同的变量,但我只希望由m.n的特定线程创建的m个线程共享这些线程。我可以遵循哪些实现来做同样的事情吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用其构造函数

将共享变量传递到B
class B extends Thread {
    final private Object shared;

    B(Object obj) {
        shared = obj;
    }
}

现在让A将同一个对象传递给它创建的每个B

答案 1 :(得分:0)

这里有一些使用可变ArrayList作为共享值的工作代码,每个ClassB线程在列表中添加10个数字,然后结束执行。

import java.util.ArrayList;
import java.util.List;

public class FooMain {

    public static void main(String [] args) throws InterruptedException {
        FooMain f = new FooMain();
        ClassA a = f.new ClassA(10);
        a.start();
            // Give all the threads some time to finish.
        Thread.sleep(1000);
        for (String x : a.list) {
            System.out.println(x);
        }
        System.out.println(a.list.size());
    }

    public class ClassA extends Thread {
        public List<String> list;       
        private List<ClassB> threads;

        public ClassA(int m) {
            this.list = new ArrayList<>();
            this.threads = new ArrayList<>();
            for(int i = 0; i < m; i++) {
                this.threads.add(new ClassB(i, this.list));
            }
        }

        @Override
        public void run() {
            for (ClassB b : this.threads) {
                b.start();
            }
        }
    }

    public class ClassB extends Thread {
        private List<String> list;
        private int id;

        public ClassB(int id, List<String> list) {
            this.id = id;
            this.list = list;
        }

        @Override
        public void run() {
            for(int i = 0; i < 10; i++) {
                synchronized(this.list) {
                    this.list.add("Id:" + Integer.toString(this.id) + " - #: " + Integer.toString(i));
                }
            }
        }
    }
}