在Runnable内部运行

时间:2016-12-23 16:21:18

标签: java android multithreading runnable

基本上,我为每个用户提供了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。

知道如何在不同的线程中启动那些可运行的东西吗?

1 个答案:

答案 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) {

                }
            }
       }