防止两个事件同时发生

时间:2018-03-16 14:48:58

标签: java multithreading

关于:有两个线程正在运行 - 一个检查超时(一段时间不活动),另一个是用户使用UI的位置。
问题:在用户操作之前稍微发生超时事件,即使在相同的毫秒时间内,根据我可以看到的日志

2018-03-15 16:58:54:921 INFO  <main> {Thread-58} [InputTimeoutThread] Input timeout occured.
2018-03-15 16:58:54:921 DEBUG <main> {AWT-EventQueue-1} [INPUT_EVENT] Input event : functionKeyID = 10056
2018-03-15 16:58:54:921 DEBUG <main> {AWT-EventQueue-1} [FunctionManagerImpl] Calling function [ID (10056)]

结果:由于调用超时注销事件而导致结果不一致,但同时用户操作已完成。
如果在用户操作之前发生超时,则会阻止用户执行任何操作,但是这不会发生在您可以看到的情况。

任何人都可以建议如何解决这个问题?因此可以保证:在某些事件开始之后(在不同的线程中)没有可能的动作。

2 个答案:

答案 0 :(得分:2)

您可以使用锁定。

Lock myLock = new ReentrantLock();

在你的超时和其他线程调用中

myLock.lock();
try
{
    // code
}
finally
{
    myLock.unlock();
}

在执行超时代码之前以及想要处理输入时,只需锁定锁即可。

使用volatile boolean标志可能更有效,因为您在处理输入时不会支付锁定开销。

答案 1 :(得分:1)

您可以使用某种技术在线程之间传输数据。例如,您可以使用volatile原语: private volatile boolean isTimeoutElapsed = false; 然后在带超时的线程中你可以这样做:

isTimeoutElapsed = true;

并在UI线程中:

if (!isTimeoutElapsed)
{
    doAction();
};