问题描述
我的项目有一个按钮。当按钮被按下时,它执行一个函数,SimulateDataUpload
。
此 SimulateDataUpload 被 lock.lock()
锁定。
有一个 for 循环,打包在一个 runnable 中,它更新进度条。
runnable 的 onRun 也用 lock.lock()
锁定。
当我快速单击按钮两次时,很明显 for 循环尚未完成迭代,因此不应释放锁。为什么代码再次输入 SimulateDataUpload
?
MainActivity 中的代码:
// defined before onCreate();
private Lock lock = new ReentrantLock();
// defined in onCreate();
simulateDataUploadButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
SimulateDataUpload();
}
});
public void SimulateDataUpload()
{
lock.lock();
try
{
Log.i("myTag","Thread name: " + Thread.currentThread().getName()
+ ". Inside SimulateDataUpload. lock acquired.");
Handler uiOperationsHandler = new Handler();
setUiElements(true);
Runnable simulateDataUploadRunnable = new Runnable()
{
@Override
public void run()
{
lock.lock();
try
{
Log.i("myTag","Thread name: "
+ Thread.currentThread().getName()
+ ". Inside runnable threadLockObject. lock
acquired.");
for (int i = 0; i < maxProgressBar + 1; i++)
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
int finalI = i;
uiOperationsHandler.post(new Runnable()
{
@Override
public void run()
{
Log.i("myTag","Thread name: "
+ Thread.currentThread().getName()
+ ". i: " + finalI
+ ". Inside
uiOperationsHandler.post.");
taskCompletedEventListener.
getCallBackFunction().
onTaskCompletedEvent(finalI ==
maxProgressBar);
}
});
}
}
finally
{
lock.unlock();
Log.i("myTag","Thread name: "
+Thread.currentThread().getName()
+". lock released.");
}
}
};
Thread simulateDataUploadThread = new
Thread(simulateDataUploadRunnable);
simulateDataUploadThread.start();
}
finally
{
lock.unlock();
Log.i("myTag","Thread name: " +Thread.currentThread().getName()
+". lock released.");
}
}
这里是按钮只点击一次时的正常输出:
I/myTag: Thread name: main. Inside SimulateDataUpload. lock acquired.
I/myTag: Thread name: Thread-8. Inside runnable threadLockObject. lock acquired.
I/myTag: Thread name: main. lock released.
I/myTag: Thread name: main. i: 0. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 1. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 2. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 3. Inside uiOperationsHandler.post.
I/myTag: Thread name: Thread-8. lock released.
这是单击按钮两次时的输出。我不明白为什么我要第二次输入“Inside SimulateDataUpload...”,但很明显带有锁定对象的可运行对象尚未释放锁定(尚未完成其 for 循环迭代):
I/myTag: Thread name: main. Inside SimulateDataUpload. lock acquired.
I/myTag: Thread name: main. lock released.
I/myTag: Thread name: Thread-11. Inside runnable threadLockObject. lock acquired.
I/myTag: Thread name: main. i: 0. Inside uiOperationsHandler.post.
I/myTag: Thread name: Thread-11. lock released.
I/myTag: Thread name: main. Inside SimulateDataUpload. lock acquired.
I/myTag: Thread name: main. lock released.
I/myTag: Thread name: Thread-12. Inside runnable threadLockObject. lock acquired.
I/myTag: Thread name: main. i: 1. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 2. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 3. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 0. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 1. Inside uiOperationsHandler.post.
I/myTag: Thread name: main. i: 2. Inside uiOperationsHandler.post.
I/myTag: Thread name: Thread-12. lock released.
I/myTag: Thread name: main. i: 3. Inside uiOperationsHandler.post.
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)