Android 从AsyncTask启动的可运行程序互相等待
我在AsyncTask中有以下代码:Android 从AsyncTask启动的可运行程序互相等待,android,performance,runnable,Android,Performance,Runnable,我在AsyncTask中有以下代码: @Override protected ArrayList<Information> doInBackground(Integer... params) { for (String[] info:informations) { final String[] infoFinal = info; Runnable runnable = new Runnable() @Overri
@Override
protected ArrayList<Information> doInBackground(Integer... params)
{
for (String[] info:informations)
{
final String[] infoFinal = info;
Runnable runnable = new Runnable()
@Override
public void run()
{
Log.w("DEBUG", String.format("Runnable %s started",info[0]));
synchronized (this)
{
publishProgress(InfoAsyncTask.this.counter++);
}
for (String infoInst: infoFinal )
{
try
{
some long execution
...
};
runnable.run();
}
}
检查时间戳。它们应该几乎相同(考虑到一些队列等待)。 我认为当一个线程启动时,它会立即返回并让循环继续。
是什么让我的runnable可以互相等待?
runnable
不是线程。它只是一个接口
,只有一个方法-运行
(这使得它的行为与其他方法没有区别)。您应该改用新线程(yourRunnable).start()
尽管考虑使用<代码> TycPoPoExcel执行器< /C> >代替一组普通线程。
我有不同的认识:“在Java中创建线程有两种方式:通过扩展线程类(java .java线程)@ Nestor,您不扩展<代码>线程< /Cuff>类,实现可运行接口(java .Lang.RunnEnter),您刚刚实现了runnable。@Nester在详细介绍runnable方法时,在您链接的页面下方:“Thread类的对象是通过将runnable对象作为参数传递给Thread构造函数创建的。Thread对象现在有一个实现run()方法的runnable对象。”@Dmitry Zaitsev:我的错,您是对的,我错过了线程:)@ Nestor再次考虑使用某种<代码>执行器< /代码>,而不是手动创建所有的<代码>线程< /代码>。因为您很可能会超过可用线程的限制,应用程序将崩溃。为什么要在AsyncTask中使用线程?它已经是一个线程了,在线程中启动线程是没有意义的。我尝试在后台启动并行处理。如果不使用线程,如何在单个后台线程内启动并行处理?在检索数据后从主线程启动并行处理。通过启动AsyncTask
类的多个实例可以实现这一点。要运行任务,它们需要收集信息(这需要时间,因此是后台任务)。在这之后,使用带有GUI线程附件的AsyncTask就太过分了。实际上,它应该是这样工作的:1)运行1个任务,收集信息并将数据返回到主线程;2) 在主线程中运行for循环,并在每次迭代中创建一个新的异步任务并向其传递数据。
07-31 10:35:28.046: WARN/DEBUG(8983): Runnable 0 started
07-31 10:37:00.343: WARN/DEBUG(8983): Runnable 1 started
07-31 10:37:37.843: WARN/DEBUG(8983): Runnable 2 started
07-31 10:37:54.359: WARN/DEBUG(8983): Runnable 3 started
07-31 10:38:16.882: WARN/DEBUG(8983): Runnable 4 started
07-31 10:38:42.171: WARN/DEBUG(8983): Runnable 5 started