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:
- Iniciar nuevo subproceso en Async Task
- Android BroadcastReceiver o método simple de devolución de llamada?
- La forma más fácil de usar Picasso en la notificación (icono)
- ¿Cómo se utiliza un TimerTask para ejecutar un hilo?
- Mensajería al hilo de la interfaz de usuario
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(); } }
- Cómo utilizar Runnable.wait () en AsyncTask? ¿Por qué el AsyncTask NO espera ...?
- Contexto dentro de un Runnable
- Quiero crear thread temporizador para Android con Xamarin
- Diferencia entre thread / runnable, handler, runonuithread, asynctask
- Android: Sincronización con el subproceso de procesador de OpenGL
- Android: Dos instancias de Media Recorder al mismo tiempo
- Acceso al dominio desde un subproceso incorrecto Excepción mientras se envió una copia usando copyFromRealm
- Cola de tareas en Android como en GCD en iOS?
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 usar el micrófono en Android
- Cómo utilizar excepciones no compatibles para versión de plataforma inferior