我在java中面临一个问题,其中我的程序最初创建n
独立线程(of ClassA
),然后每个线程ClassA
创建m
依赖线程(ClassB
)。所以总的来说,我现在有m.n
线程(的ClassB
)。现在我想在由特定线程创建的m
线程(的)之间共享一个变量。我不能使用静态,因为所有线程都将共享相同的变量,但我只希望由特定线程创建的线程共享这些。有没有我可以遵循的实现来做同样的事情?ClassB
ClassA
m.n
m
ClassA
谢谢。
我在java中面临一个问题,其中我的程序最初创建n
独立线程(of ClassA
),然后每个线程ClassA
创建m
依赖线程(ClassB
)。所以总的来说,我现在有m.n
线程(的ClassB
)。现在我想在由特定线程创建的m
线程(的)之间共享一个变量。我不能使用静态,因为所有线程都将共享相同的变量,但我只希望由特定线程创建的线程共享这些。有没有我可以遵循的实现来做同样的事情?ClassB
ClassA
m.n
m
ClassA
谢谢。
B
您可以使用其构造函数将共享变量传递给
class B extends Thread {
final private Object shared;
B(Object obj) {
shared = obj;
}
}
现在A
将相同的对象传递给B
它创建的每个对象
这里有一些使用可变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));
}
}
}
}
}