2011-12-02 17 views
10

¿Existe un límite superior en el número de subprocesos de Swing Worker que se pueden ejecutar o en la medida en que la memoria es compatible? También es esto configurable en alguna parte?¿Cuál es la cantidad máxima de subprocesos de trabajo oscilante que se pueden ejecutar?

+0

Creo que un punto confuso con SwingWorkers es que el método SwingWorker.execute() ejecuta los trabajadores en un grupo de subprocesos predeterminado/privado, que se repara en un número bajo de subprocesos. Esto es probablemente suficiente y razonable para aplicaciones pequeñas/simples. Sin embargo, haga dos observaciones para tener más control sobre la concurrencia: 1. SwingWorkers son RunnableFutures 2. SwingWorkers NO debe ejecutarse llamando al método SwingWorker.execute(). Por lo tanto, solo configure su propio grupo de subprocesos (ExecutorService) configurado según sus necesidades, y luego envíe() o ejecute() SwingWorkers allí. –

Respuesta

13

A SwingWorker no es un hilo en sí, sino una tarea que se ejecutará en un hilo. Usualmente, usaría un ExecutorService para ejecutar instancias de SwingWorker; Esta interfaz también permite establecer el número de hilos:

int n = 20; // Maximum number of threads 
ExecutorService threadPool = Executors.newFixedThreadPool(n); 
SwingWorker w; //don't forget to initialize 
threadPool.submit(w); 

Ahora, si usted presentar más de n SwingWorker casos, van a tener que hacer cola y esperar hasta que un hilo de la piscina se pone a disposición.

+0

Así que está diciendo teóricamente que puedo ejecutar cualquier cantidad de tareas de Swing Worker siempre que ejecute hilos individuales para cada una de ellas. –

+0

En principio sí; por supuesto, la potencia de cálculo será un problema. – mort

+1

umm .... ¿qué? ¿por qué harías esto? SwingWorker tiene su propia agrupación cuyo valor predeterminado es el tamaño 10, y cuando invoca 'SwingWorker # execute()' planifica la tarea. Programa este SwingWorker para su ejecución en una cadena de trabajo. Hay una cantidad de hilos de trabajo disponibles.: Https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#execute() ... hacer esto usted mismo está reinventando la rueda. 'SwingWorker' fue una utilidad creada por lo que no tendrías que hacer esto. La única razón por la que harías esto sería si el tamaño de grupo predeterminado de 10 fuera demasiado pequeño, y en ese momento usarías un 'Ejecutable' sin procesar – searchengine27

2
final int corePoolSize = 100; 
final int maximumPoolSize = 100; 
final long keepAliveTime = 100000; 
final TimeUnit unit = TimeUnit.SECONDS; 
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize); 
sun.awt.AppContext.getAppContext().put(SwingWorker.class, 
       new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue)); 

El ejemplo de código anterior le permitirá tener más que el número predeterminado de ejecución de SwingWorkers. Por supuesto, está accediendo a alguna clase backdoor sun.awt.AppContext, pero es una solución rápida para los interesados, y no puede/está dispuesto a proporcionar su propio ExecutorService.

Cuestiones relacionadas