关于:有两个线程正在运行 - 一个检查超时(一段时间不活动),另一个是用户使用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)]
结果:由于调用超时注销事件而导致结果不一致,但同时用户操作已完成。
如果在用户操作之前发生超时,则会阻止用户执行任何操作,但是这不会发生在您可以看到的情况。
任何人都可以建议如何解决这个问题?因此可以保证:在某些事件开始之后(在不同的线程中)没有可能的动作。
答案 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();
};