我目前对如何解决某个问题感到困惑:
我有一个帖子,其run()
方法大致如下:
@Override
public void run() {
running = true;
while(running) {
foo(x);
draw(x);
}
}
现在这个foo用变量x
做了一些事情。
在主线程中有一个监听器执行一个方法,该方法也改变了x
@Override
public void mouseDragged(MouseEvent e) {
bar(x);
}
现在的问题是,有时x
会被bar(x)
方法修改,而foo(x)
也会更改x
,这会使x
混乱。< / p>
我认为可以解决的问题是,侦听器在触发时等待循环到达终点,执行其方法并bar(x)
同时让线程等待,然后通知线程让它继续循环。
我对线程处理不是很有经验,如果有人帮助我,我会很感激。很抱歉,如果这个问题很容易解决,我就无法看到解决方案。
答案 0 :(得分:0)
你应该 x 一个 AtomicInteger (一个线程安全的整数包装器)并使用它的方法在 bar()中更新和检索它, foo(), draw()。
这里的一些关键方法是 incrementAndGet()(如 ++ x ), getAndIncrement()(如 x ++ 强>)。更多JavaDocs: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html
Java 8为该接口添加了更多内容,以便原子地进行更大的计算。
AtomicInteger 可能不是正确的类型。我猜这是基于你的例子中猜测 x 是 int 。
答案 1 :(得分:0)
没关系,我只需要同步x
的方法,这些方法由循环和监听器调用。
我应该通过说x
和x.foo()
代表访问x.bar()
,对不明确的问题感到抱歉。