对如何处理循环线程感到困惑

时间:2015-11-10 20:16:47

标签: java

我目前对如何解决某个问题感到困惑:

我有一个帖子,其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)同时让线程等待,然后通知线程让它继续循环。

我对线程处理不是很有经验,如果有人帮助我,我会很感激。很抱歉,如果这个问题很容易解决,我就无法看到解决方案。

2 个答案:

答案 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的方法,这些方法由循环和监听器调用。

我应该通过说xx.foo()代表访问x.bar(),对不明确的问题感到抱歉。