java启动一个后台线程接连完成

时间:2012-12-04 01:41:08

标签: java android multithreading android-service

我看到了这个问题:how to run one thread after complete another thread,但答案对我来说不合适。

我有这样的Android代码:

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将param Runnable对象作为一些硬操作,我正在后台服务中处理。所以,当我调用方法时: startTask()我设置 running = true; 以防止双重执行任务。但是,我也需要在第一个线程完成第二个线程后立即设置 running = false; 以启用其他操作。

如何等待第一个线程的完整性,不要冻结主线程?谢谢!

3 个答案:

答案 0 :(得分:6)

您可以使用SingleThreadExecutor

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(runnable1);
executor.execute(runnable2);

答案 1 :(得分:5)

试试这个:

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();

我改变了:

  • 为'first'添加最终的keyworrd
  • 在第二个帖子的开头用#join等完第一个帖子。
  • 很快启动第二线程。

答案 2 :(得分: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,因为正在从多个线程读取和写入此变量。