java启动一个又一个后台线程完成
我看到了这个问题:,但这个问题的答案不适合我 我有这样的Android 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
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
作为paramRunnable
对象,带有一些我正在后台服务中处理的硬操作。所以,当我调用方法: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(硬件后退)按钮时,它最终运行,但不是我所需要的方式。谢谢,这个变量也可以,但我不能将两者都作为正确的变量进行检查。谢谢,这个变量也可以,但我不能将两者都作为正确的变量进行检查。