Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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
Android 从AsyncTask启动的可运行程序互相等待_Android_Performance_Runnable - Fatal编程技术网

Android 从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

我在AsyncTask中有以下代码:

@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