2015-04-22 25 views
5

Nella implementazione interna di AsyncTask (in Android SDK) here, sDefaultExecutor viene dichiarato con volatile parola chiave e anche execute() metodo SerialExecutor viene dichiarato con synchonized parola chiave.Volatile e sincronizzata in AsyncTask

  1. Ora, poiché AsyncTask può essere eseguito solo dal thread dell'interfaccia utente e anche se eseguiamo un'istanza di AsyncTask, non possiamo excute nuovo lo stesso esempio meno l'istanza precedente ha terminato l'esecuzione. Quindi come mai ci possono essere casi di più thread qui?
  2. Perché lo SerialExecutor ha uno ArrayDeque? Perché in un momento abbiamo può avere solo una attività. Se creiamo una nuova istanza di AsyncTask, , allora non otterremo una nuova istanza di ArrayDeque, di nuovo che ha solo un'attività da affrontare?
  3. Lo stesso vale per ThreadPoolExecutor. Perché sono necessari i pool di thread quando per una particolare istanza di AsyncTask, è possibile avere una sola attività? ? Un thread è sufficiente per questo.

risposta

2

non è possibile eseguire nuovamente la stessa istanza a meno che l'istanza precedente non abbia completato l'esecuzione. Quindi come mai possono esserci casi di più thread qui?

C'è, ad esempio, il thread principale dell'interfaccia utente e il thread dell'esecutore.

Perché SerialExecutor ha un ArrayDeque? Perché in un momento possiamo avere solo un compito. Se creiamo una nuova istanza di AsyncTask, allora non otterremo una nuova istanza di ArrayDeque, che ha ancora una sola attività da affrontare?

Non è vero che può esserci un solo compito. L'esecutore seriale può eseguire solo un'attività alla volta, ma è possibile accodare più di una attività nel thread principale e vengono eseguite una alla volta nel thread dell'esecutore.

Ci sono altri esecutori oltre all'esecutore seriale, come l'executor del pool di thread che si menziona in seguito.

Lo stesso è il caso di ThreadPoolExecutor. Perché sono necessari i pool di thread quando per una determinata istanza di AsyncTask, possiamo avere solo una Task? Un thread è sufficiente per questo.

La premessa di un solo compito alla volta non è corretta. L'executor del pool di thread è utile per l'esecuzione di più task asincroni contemporaneamente in thread separati.

Come vengono messe in coda le operazioni di coda e le attività multiple? Supponiamo di creare un'istanza di AsyncTask ed eseguirla 5 volte. Quindi se uno è in esecuzione, gli altri 4 non si avviano. SO come posso ottenere più attività in ogni caso?

È possibile eseguire un'istanza di AsyncTask una sola volta. Ma puoi pubblicare più istanze di AsyncTask per l'esecuzione.Si noti che tale operazione di registrazione (execute() e così via) è asincrona e restituisce prima che l'attività asincrona termini e si è in grado di eseguire codice aggiuntivo nel thread dell'interfaccia utente, inclusa la pubblicazione di nuove attività asincrone per l'esecuzione.

Per l'esecuzione parallela, utilizzare solo executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...).

È anche vero che dal momento che SerialExecutor è statico, quindi verrà utilizzata solo una sua istanza in tutte le istanze AsyncTask e quindi è necessaria una coda?

Sì, c'è un solo esecutore seriale nella tua app ed è condiviso tra tutte le attività asincrone.

+0

Come viene messa in coda la messa in coda di taks e attività multiple? Supponiamo di creare un'istanza di AsyncTask ed eseguirla 5 volte. Quindi se uno è in esecuzione, gli altri 4 non si avviano. SO come posso ottenere più attività in ogni caso? – Diffy

+0

Ok. È anche vero che dal momento che SerialExecutor è statico, quindi verrà utilizzata solo una sua istanza in tutte le istanze AsyncTask e quindi è necessaria una coda? – Diffy