基本上,我为每个用户提供了5个Runnable。
在每个Runnable中,必须等待变量更改才能继续。我将使用Semaphore或CountDownLatch。
所以在每个Runnable中都有一个可以等待的runnable。
这是一个例子。 r1是一个可以运行的用户,所以永远不会结束。
final Handler handler = new Handler();
Runnable r1 = new Runnable() {
@Override public void run() {
// here must be another runnable for waiting
Runnable r2 = new Runnable() {
@Override public void run() {
if (condition) {
latch.countDown();
// ending the runnable
handler.removeCallbacks(r2);
} else {
// keep waiting
handler.postDelayed(r2, 1000);
}
}
}
latch.await();
// restarting the runnable
handler.postDelayed(r1, 1000);
}
}
使用latch.await()
时的问题是在主线程中运行,因此阻止了UI。
知道如何在不同的线程中启动那些可运行的东西吗?
答案 0 :(得分:0)
我想要做的是一个不停止运行的线程,某个地方需要等待一个变量来改变,以便继续其他指令。在单击按钮时UI中的某处,信号量会增加。并在线程中等待它可用。这是我做的解决方案
Semaphore sem = new Semaphore(0,true);
//somewhere in UI sem.release();
Thread thread = new Thread()
{
@Override
public void run() {
try {
while(true) {
sleep(1000);
semaphore.acquire();
// when updating the UI is needed
runOnUiThread(new Runnable() {
@Override
public void run() {
// work
}
});
}
} catch (InterruptedException e) {
}
}
}