我有 2 个线程在运行。一个是 TimeStepThread
,另一个是 CarThread
。
CarThread
每 500 毫秒运行一次。 TimeStepThread
以我指定的任何时间间隔运行。现在,每 500 毫秒,CarThread
更新道路上汽车位置的移动。但是,每次调用 TimeStepThread
时,我都想获取汽车位置值。例如,我有 1 辆车,无论如何每 500 毫秒更新一次,但我想每 2 秒设置一个带有该汽车位置的标签。
我的类(class)是这样设置的:
模拟
类有一个TimeStepThread
和一个CarThread
。
在我的模拟
(或更确切地说是框架)中,我想在每个时间步间隔更新汽车位置的值。因此,每 2000 毫秒,我需要在模拟类中更新一些东西/返回一些东西。
只是我不知道该怎么做。因为我的线程在 Simulation
中,所以我不能真正从 run()
调用 Simulation
方法,更不用说它了有点乱。听众,也许?
编辑:我已经可以在时间步线程中访问汽车。这不是问题。我正在使用一个包含汽车的容器类,两个线程都可以访问并且 CarThread
也会更新它。我的问题是每次调用 TimeStepThread 时模拟类都有更新的字符串,或者每次调用 TimeStepThread 时更新帧标签。
最佳答案
两个类,两个线程中的类,都需要访问汽车列表。
在这种情况下,汽车是汽车类的实例。
时间步线程有一个实现其工作的类。 (这是读取汽车的位置。)
汽车线程有一个实现其工作的类。 (正在更新位置。)
每个执行类型类都将访问汽车对象,以使用位置变化信息更新它们或读取任何内容。例如,您必须同步
访问该位置的汽车类(或下面提到的汽车容器)中的实例方法,这样各个线程就不会互相踩踏。
这里有两种类似的实现方式。
1) 每次创建汽车时,您都将其传递给两个工作类中的每一个。他们每个人都有自己的所有汽车内部 list 。如果你要摆脱一辆车,你必须告诉他们两个。
2) 在开始时,您为两个工作类中的每一个都提供了对汽车容器类的引用。也许只是一个列表——不过是一个并发列表。也许是一个自定义类。当你创建一辆汽车时,你告诉汽车容器类(通过添加它)。当您丢失汽车时,您也会告诉它。
至于模拟类,您希望它在汽车位置发生变化时得到通知。同样有两种方法,但它们是相似的。
在这两种情况下,您都必须将模拟类实例传递给进行更新的类。模拟类有一个方法,比如 updateCar()
,更新类在完成更新后调用该方法。
1) 版本 1 - 对模拟类实例的调用只告诉它发生了一些变化。模拟类中的代码将识别更改的内容并对其进行处理,或者它只会更新所有内容。
2) 版本 2 - 对模拟类实例的调用将包括所有已更改汽车的列表。模拟类不用去搜索找什么改变了 它只能更新发生变化的事情。
棘手的部分是您必须记住对更新方法的那些调用是在更新线程中发生的。因此,例如,如果您使用 Swing 更新屏幕上的文本,则必须使用 SwingWorker 来让更新在事件线程中发生。
如果您不能将该工作转移到安全线程,则必须确保所有正确的事情都是并发或同步的,这样它们就不会相互干扰。
关于java - 每次线程执行它的运行时获取一个值/返回一些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16652732/