Java 防止两个事件同时发生

Java 防止两个事件同时发生,java,multithreading,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} [IN

关于:有两个线程正在运行-一个是检查超时(一段时间内不活动),另一个是用户使用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)]
2018-03-15 16:58:54:921信息{Thread-58}[InputTimeoutThread]发生输入超时。
2018-03-15 16:58:54:921调试{AWT-EventQueue-1}[INPUT_EVENT]输入事件:functionKeyID=10056
2018-03-15 16:58:54:921调试{AWT-EventQueue-1}[FunctionManagerImpl]调用函数[ID(10056)]
结果:调用超时注销事件导致结果不一致,但同时执行了用户操作。
如果超时发生在用户操作之前,它会阻止用户执行任何操作,但正如您所看到的,这里没有发生这种情况


有谁能建议如何解决这个问题吗?因此可以保证:在某些事件发生后(在不同的线程中),不可能执行任何操作。

您可以使用一些技术在线程之间传输错误数据。例如,您可以使用volatile基元:
private volatile boolean istimeoutepersed=false
然后,在具有超时的线程中,您可以执行以下操作:

isTimeoutElapsed = true;
在UI线程中:

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

您可以使用一些技术在线程之间传输错误数据。例如,您可以使用volatile基元:
private volatile boolean istimeoutepersed=false
然后,在具有超时的线程中,您可以执行以下操作:

isTimeoutElapsed = true;
在UI线程中:

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

你可以用一把锁

Lock myLock = new ReentrantLock();
在超时和其他线程调用中

myLock.lock();
try
{
    // code
}
finally
{
    myLock.unlock();
}
只需在执行超时代码之前和处理输入时锁定锁


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

您可以使用锁

Lock myLock = new ReentrantLock();
在超时和其他线程调用中

myLock.lock();
try
{
    // code
}
finally
{
    myLock.unlock();
}
只需在执行超时代码之前和处理输入时锁定锁

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