1

我看到了这个问题:如何在完成另一个线程后运行一个线程 ,但它的答案不适合我。

我有这种适用于 Android 的 java 代码:

public void startTask(Runnable r)
    {
        running = true;
        Log.i(tag, "-----------start.Runnable-----------");

        Thread first = new Thread(r);
        first.start();

        Thread second = new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                running = false;
            }
        });
}

首先将我在后台服务中处理的一些硬操作Thread作为参数对象。Runnable所以,当我调用 method: startTask()我设置running = true; 防止双重执行任务。但是,我也需要在第一个线程完成后立即启动第二个线程来设置running = false; 使其他操作能够执行。

我怎样才能等待第一个线程的完整性不冻结主线程?谢谢!

4

3 回答 3

7

您可以使用SingleThreadExecutor.

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(runnable1);
executor.execute(runnable2);
于 2012-12-04T02:56:15.533 回答
6

试试这个:

final Thread first = new Thread(r);
first.start();

Thread second = new Thread(new Runnable() {

    @Override
    public void run() {
        first.join();
        // TODO Auto-generated method stub
        running = false;
    }
});
second.start();

我变了:

  • 为“第一”添加最终关键字
  • 在第二个线程开始时通过#join 等待第一个线程的完成。
  • 很快开始第二个线程。
于 2012-12-04T02:29:43.520 回答
2

我不是 Android 程序员,但这样的事情可能会起作用:

private volatile boolean running = false;

public void startTask(final Runnable r)
{
    running = true;
    Log.i(tag, "-----------start.Runnable-----------");

    Runnable runme = new Runnable() {
        @Override
        public void run() {
            try {
                r.run();
            } finally {
                running = false;
            }
        }
    };

    new Thread(runme).start();
}

它只需要一个线程来运行任务然后清除running标志。注意volatile在声明中的使用running,因为这个变量是从多个线程中读取和写入的。

于 2012-12-04T02:32:07.067 回答