我想在新线程中创建一个对象,这将创建另一个线程。在最后创建的线程中,我需要一个引用来自创建此线程的确切对象的变量。到目前为止,我有这段代码:
主要
public static void main(String[] args) {
for(int i = 0; i < 2; i++){
ClassThread ct = new ClassThread();
Thread t = new Thread(ct);
t.start();
}
}
ClassThread
public static volatile int liczba = 1;
private static int id = 0;
@Override
public void run() {
for(int i = 0; i < 2; i++){
Class1 cla = new Class1(liczba, id);
Thread t = new Thread(cla);
t.start();
id++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
的Class1
private volatile int var;
private int id;
public Class1(int _var, int _id) {
var = _var;
id = _id;
}
@Override
public void run() {
while(true){
System.out.println("Thread: " + id + " : " + var);
var++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
如果您需要从一个线程获得int
引用,则必须指定自己的MutableInteger
类,或使用AtomicInteger。原子整数具有正面的副作用,因为操作可以是原子的。有关更详尽的答案,请参阅This answer。
如果问题是关于非基本类型的,那么您可以简单地将所需的引用传递给构造函数,就像您已经尝试过的那样。对该对象的内部状态的任何更改都将反映给引用的所有持有者。有些对象是不可变的(String
可能是最知名的,但请注意Integer
,Long
等以同样的方式工作。),因此不能用于这样。
请注意,如果您传递了引用,则对内部引用var = "hello";
所做的任何分配都不会影响您班级以外的任何内容。您只需将您的私有引用交换为另一个引用,将所有其他引用保留为旧对象。这与Java总是pass-by-value。