仍处于学习Java中的oop概念的阶段。在oracle教程here中提供的并发示例中((请耐心等待我快速查看,很容易)),producerconsumerexample
类触发producer
的两个线程, consumer
两者都应通过Drop
对象drop
交换数据。在这个对象中,他们应该等待/得到彼此的通知。
public class ProducerConsumerExample {
public static void main(String[] args) {
Drop drop = new Drop();
(new Thread(new Producer(drop))).start();
(new Thread(new Consumer(drop))).start();
}
}
我不明白的是drop
类将producerconsumerexample
对象传递给每个线程,它为我们提供了两个新的本地Drop
对象,也称为drop
两个线程中的每一个都有一个。据我所知,这是因为传入Java是值,而不是引用。因此,每个线程现在都有自己的Drop
对象版本,那么为什么它们仍然应该通过相同的原始Drop
对象共享数据,因为每个线程都有自己的版本?!
有人请求帮助,我真的非常感激。
答案 0 :(得分:0)
如果您谈论此示例,并且删除变量 - 它的对象,则在java中,所有对象都按引用传递,而不是按值传递。生产者和消费者使用相同的对象。对于原语传递值
public class ProducerConsumerExample {
public static void main(String[] args) {
Drop drop = new Drop();
(new Thread(new Producer(drop))).start();
(new Thread(new Consumer(drop))).start();
}
}
答案 1 :(得分:0)
有点不同。正如你所说,Java是通过值而不是通过引用传递的,但是当我们传递对象的值时,我们将引用传递给它。
一开始可能是一种误解,因为他们决定将对象的位置称为“参考”。
因此Procuder和Consumer保存相同的引用,因此它们正在处理同一个对象。
例如:
class Foo {
Bar x;
public Foo(Bar v) { this.x = v; }
public String getString() { return x.y; }
}
class Bar {
String y;
public Bar() {}
}
class Test {
public static void main(String[] args) {
Bar x1 = new Bar();
x1.y = "Test1";
Foo x2 = new Foo(x1);
/* the method getString() returns "Test1" */
System.out.println(x2.getString());
/* If I change x1.y, x2.getString() returns a different element */
x1.y = "Test 2";
System.out.println(x2.getString());
}
}