我有两个主题。一个线程有一个myObjectManager实例。 myObjectManager有一个对象列表,以及一个检索对象的方法(public myObjectClass getObjectById(int ID))
我需要第一个线程来渲染myObjectManagers对象列表中的对象,第二个线程来执行游戏逻辑并移动它等等。
这就是我试过的
//thread 1:
m = myObjectManager.getObjectById(100);
m.render();
//thread 2:
m = myObjectManager.getObjectById(100);
m.rotate( m.getRotation() + 5 ); //increment rotation value
但是,似乎线程1具有没有更新旋转的对象实例。当我运行它时,渲染的对象不会旋转,但是当我使第二个线程打印出旋转值时,它会旋转。
在C ++中,我只是让函数getObjectById()返回一个指向myObjectClass实例的指针,但是当我说“return myInstance;”时,我不确定java究竟是做什么的。 我如何在java中做类似的事情?
抱歉,我是这种语言的新手!
答案 0 :(得分:4)
在Java中,所有Object变量都是“指针”(或“引用”,正如人们通常所说)。问题必须在其他地方。我的猜测是线程1已经在线程2修改它之前渲染了对象。
编辑:另一种理论:后续的render()操作实际上并没有改变屏幕显示。旋转值更新得很好 - 但它不会反映到显示器上。
答案 1 :(得分:3)
引用(指针)没问题,但在Java中,每个线程都允许创建对象的本地副本(将其视为缓存),除非它们以某种方式同步,由一个线程进行更改另一方可能看不到。
This教程有望提供帮助。
答案 2 :(得分:2)
你有2个潜在的问题,这两个问题都在不同的答案中说明了。
要确定我们必须查看 m 类的来源。另外,如果getObjectById()也不是线程安全的话,你可能会遇到问题。
答案 3 :(得分:1)
尝试将对象中的rotation
变量标记为volatile
答案 4 :(得分:0)
Java中的所有对象都通过引用传递 编写那些你不想做的事情的代码是不可能的。
你的第一个线程可能在第二个线程之前运行。
答案 5 :(得分:0)
Java中的所有对象引用,就像你的m变量一样,实际上是指针。
因此,在您的示例中,两个m变量都指向同一个对象。