Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java启动一个又一个后台线程完成_Java_Android_Multithreading_Android Service - Fatal编程技术网

java启动一个又一个后台线程完成

java启动一个又一个后台线程完成,java,android,multithreading,android-service,Java,Android,Multithreading,Android Service,我看到了这个问题:,但这个问题的答案不适合我 我有这样的Android java代码: public void startTask(Runnable r) { running = true; Log.i(tag, "-----------start.Runnable-----------"); Thread first = new Thread(r); first.start(); Thread seco

我看到了这个问题:,但这个问题的答案不适合我

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

我怎样才能等到第一个线程完成后再不冻结主线程??谢谢

试试这个:

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();
我改变了:

  • 为“第一个”添加最终关键字
  • 在第二个线程开始处连接,等待第一个线程完成
  • 尽快启动第二个线程
试试这个:

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();
我改变了:

  • 为“第一个”添加最终关键字
  • 在第二个线程开始处连接,等待第一个线程完成
  • 尽快启动第二个线程

我不是安卓程序员,但这样做可能会奏效:

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
声明中的使用,因为这个变量是从多个线程读取和写入的。

我不是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
标志。请注意在
running
声明中使用了
volatile
,因为此变量是从多个线程读取和写入的。

您可以使用
SingleThreadExecutor

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

您可以使用
SingleThreadExecutor

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

为什么不使用?它有方法
onPostExecute
,在该方法中,您可以轻松启动另一个
AsyncTask
。为什么不使用?它有方法
onPostExecute
,在该方法中,您可以轻松启动另一个
AsyncTask
。谢谢,但我尝试了这种方法,但它没有以适当的方式工作。当我按下hardware BACK(硬件返回)按钮时,它最终以我需要的方式运行。谢谢,但我尝试了这种方式,但它并没有以适当的方式工作。当我按下hardware BACK(硬件后退)按钮时,它最终运行,但不是我所需要的方式。谢谢,这个变量也可以,但我不能将两者都作为正确的变量进行检查。谢谢,这个变量也可以,但我不能将两者都作为正确的变量进行检查。