Prioridad ThreadPoolExecutor en Java (Android)

Estoy tratando de hacer un ThreadPoolExecutor con prioridad. Así que defino un

private static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL, MAXPOOL, TimeUnit.SECONDS, queue, new mThreadFactory()); 

Así que la clave es la referencia de cola ahora. Pero cuando declaro:

 static PriorityBlockingQueue<mDownloadThread> queue=new PriorityBlockingQueue<mDownloadThread>(MAXPOOL,new DownloadThreadComparator()); 

El compilador da un error en la primera línea: El constructor ThreadPoolExecutor (int, int, int, TimeUnit, PriorityBlockingQueue, FileAccess.mThreadFactory) está indefinido con un solo quickfix: Cambie el tipo de 'cola' a BlockingQueue . ¿Me puede ayudar a entender cuál es el problema?

Gracias

Información adicional:

Para comparar los runnables implementé la siguiente clase

 class mDownloadThread implements Runnable{ private Runnable mRunnable; private int priority; mDownloadThread(Runnable runnable){ mRunnable=runnable; } @Override public void run() { mRunnable.run(); } public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } } 

El comparador:

 class DownloadThreadComparator implements Comparator<mDownloadThread>{ @Override public int compare(mDownloadThread arg0, mDownloadThread arg1) { if (arg0==null && arg1==null){ return 0; } else if (arg0==null){ return -1; } else if (arg1==null){ return 1; } return arg0.getPriority()-arg1.getPriority(); } } 

ThreadPoolExecutor constructor ThreadPoolExecutor acepta BlockingQueue<Runnable> y no BlockingQueue<? extends Runnable> BlockingQueue<? extends Runnable> , por lo que no se puede pasar a él PriorityBlockingQueue<mDownloadThread> instancia.

Puede cambiar el tipo de queue a PriorityBlockingQueue<Runnable> , pero en ese caso no podrá implementar Comparator<mDownloadThread> sin la conversión dentro del método de compare .

La otra solución es omitir la comprobación genérica de tipos, pero sería su responsabilidad enviar sólo instancias de mDownloadThread para execute método:

 static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL, MAXPOOL, TimeUnit.SECONDS, (PriorityBlockingQueue) queue, new mThreadFactory()); 

El problema es que ThreadPoolExecutor está esperando un BlockingQueue<Runnable> y está pasando un PriorityBlockingQueue<mDownloadThread> . El PriorityBlockingQueue implementa BlockingQueue para que no sea el problema. El problema es el Runnable . No se puede pasar un tipo genérico de mDownloadThread donde Runnable se esperaba.

El arreglo es el siguiente:

 static PriorityBlockingQueue<Runnable> queue=new PriorityBlockingQueue<Runnable>(MAXPOOL,new DownloadThreadComparator()); 

Un

 class DownloadThreadComparator implements Comparator<Runnable>{ 

Si ThreadPoolExecutor se escribió para aceptar un BlockingQueue<? extends Runnable> BlockingQueue<? extends Runnable> lo que tiene que trabajar.

  • Cómo reducir la latencia de Thread.sleep () en Android
  • Para forzar la cancelación AsyncTask no debería el indicador periódicamente marcado en doInBackground ser volátil?
  • Android: ¿Cuándo debo usar un Handler () y cuándo debo usar un Thread?
  • Facebook y GoogleAnalytics está causando la señal fatal 11 (SIGSEGV)
  • Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas." Error en Fragmento
  • ASyncTasks bloqueando a otros
  • Actualizar la interfaz de usuario de Android desde un subproceso de otra clase
  • .debounce () de RxJava interfiriendo con los hilos de mis observables y manejo de errores
  • Android AsyncTask límites de los hilos?
  • Prueba de unidades de Android con ContentProviders
  • Despertar un hilo de dormir - interrupción () versus "dividir" el sueño en varios sueños
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.