2012-04-16 22 views
5

En Java, ¿hay alguna manera de establecer la prioridad para el hilo que llamará al método doInBackground() de un objeto SwingWorker?¿Hay alguna manera de establecer la prioridad del subproceso en segundo plano utilizado por un SwingWorker?

En la API Thread hay un método setPriority(). El método SwingWorker.execute() programa el swingworker para su ejecución en un hilo de trabajo. Me gustaría tener acceso a ese hilo de trabajo para establecer su prioridad.

Según tengo entendido, esta cadena de trabajo proviene de un grupo de subprocesos de trabajo predeterminado. ¿La única forma de manejar esto es usar mi propio ejecutor?

+4

A menos que utilice cerca del 100% de todas sus CPUs, el establecimiento de la prioridad podría no hace ninguna diferencia. Si está utilizando toda su CPU, la prioridad es solo una pista que la JVM o el sistema operativo pueden ignorar. En mi humilde opinión no va a resolver su problema. –

+0

La aplicación está dirigida específicamente a Windows y la JVM es la Oracle JVM estándar. A partir de esta otra pregunta de desbordamiento de pila, hace una diferencia en este escenario: http://stackoverflow.com/questions/297804/thread-api-priority-translation-to-os-thread-priority – Clinton

+0

Hace la diferencia a la pista dada al sistema operativo. Si hace alguna diferencia cuando no está usando toda la CPU, es la pregunta que tengo. AFAIK, si tiene una CPU de repuesto, cada subproceso que pueda ejecutarse se ejecutará independientemente de la prioridad. Solo importa cuando el sistema operativo tiene que elegir que las prioridades son importantes. –

Respuesta

7

Los JDK7 SwingWorker javadoc indicios de que los diseñadores no tenían la intención de que los usuarios interactúan directamente o modifique los hilos de fondo:

... the exact strategy of choosing a thread for any particular SwingWorker is unspecified and should not be relied on.

La implementación de SwingWorker.getWorkersExecutorService() parece reforzar esta idea, ya que Lo he implementado de una manera que no se puede cambiar fácilmente.

SwingWorker es una solución estándar para el caso típico y no tiene un caso típico. Te sugiero que escribas el código para manejar las tareas en segundo plano en lugar de intentar hackear SwingWorker para hacer lo que quieras. De esta forma, quienquiera que consiga mantener su código en el futuro (¡quizás incluso usted mismo!) No se preguntará por qué SwingWorker no se está comportando como se esperaba.

5

La única forma en que puedo pensar para hacer esto es hacer que el método de ejecución tome el hilo actual usando Thread.currentThread(). A continuación, puede establecer la prioridad de este hilo (siempre que se permita a la persona que llama).

+2

Creo que este método podría funcionar. 'Thread.currentThread()' debe ejecutarse en el método "doInBackground()" (hilo de trabajo). –

+1

Esto pareció funcionar. Creo que podría necesitar volver a su prioridad predeterminada al final del método, ya que el hilo se devolverá a un grupo y se usará para otra cosa. Al igual que Jason Braucht dijo que esto podría ser un mal diseño. – Clinton

2

A medida que el SwingWorker es una Runnable, se puede presentar a cualquier java.util.concurrent.ExecutorService

+2

También es un Futuro. –

Cuestiones relacionadas