¿Cuál es el comportamiento adecuado del proceso en segundo plano para una aplicación Java sin GUI?

StackOverflow https://stackoverflow.com/questions/440417

  •  22-07-2019
  •  | 
  •  

Pregunta

¿Cuál es la forma correcta para que una aplicación de línea de comandos Java realice trabajos en segundo plano sin acaparar recursos? ¿Debería usar sleep () en el bucle o hay una forma más elegante / eficiente?

¿Fue útil?

Solución

Algunas heurísticas:

  • No intente tomar decisiones de programación en su aplicación. El programador del sistema operativo es mucho mejor que el tuyo. Deja que haga su trabajo.
  • No sondees si no tienes que hacerlo. Por ejemplo, en lugar de dormir n segundos, luego de despertarse para verificar un zócalo no bloqueado, bloquee el zócalo. Esta segunda estrategia juega mejor con el programador del sistema operativo.
  • No use un montón enorme si no tiene que hacerlo, e intente no asignar enormes fragmentos de memoria a la vez. Una aplicación de control tiende a tener un efecto negativo en el rendimiento del sistema.
  • Use E / S tamponadas. Siempre. Si cree que necesita E / S sin búfer, asegúrese de estar en lo cierto. (Probablemente estés equivocado)
  • No generes muchos hilos. Los hilos son sorprendentemente caros; más allá de cierto punto, más hilos reducirán el perfil de rendimiento de su aplicación. Si tiene mucho trabajo que hacer al mismo tiempo, aprenda y use java.util.concurrent .

Por supuesto, esto es solo una lista de inicio ...

Otros consejos

Solo usaría sleep () si no hay trabajo que hacer. Por ejemplo, si está haciendo algo como sondear una cola de tareas periódicamente y no hay nada allí, duerma un rato y luego vuelva a verificar, etc.

Si solo está tratando de asegurarse de no acaparar la CPU pero todavía está haciendo un trabajo real, puede llamar a Thread.yield () periódicamente. Eso cederá el control de la CPU y permitirá que se ejecuten otros subprocesos, pero no lo hará dormir. Si otros procesos no necesitan la CPU, recuperará el control y continuará haciendo su trabajo.

También puede configurar su hilo a una prioridad baja: myThread.setPriority (Thread.MIN_PRIORITY);

Como dijo Ishmael, no hagas esto en tu hilo principal. Crear un " hilo de trabajo " en lugar. De esa manera, su UI (GUI o CLI) seguirá respondiendo.

Hay varias formas. Usaría ExecutorService ... por ejemplo:

ExecutorService service = Executors.newCachedThreadPool();

Callable<Result> task = new Callable<Result>() {
    public Result call() throws Exception {
        // code which will be run on background thread
    }
};

Future<Result> future = service.submit(task);

// Next line wait until background task is complete
// without killing CPU. Of course, you can do something
// different here and check your 'future' later.
//
// Note also that future.get() may throw various exceptions too,
// you'll need to handle them properly

Result resultFromBackgroundThread = future.get();

Este es el código Java 5, ExecutorService, Callable, Future y similares están en el paquete java.util.concurrent .

Un lugar para comenzar es asegurarse de que solo se usen esos recursos y no de otros objetos (para que se conviertan en basura recolectada).

Colocar sleep () en una sola aplicación de subprocesos solo detendrá el subproceso actual. Si está tratando de lograr que los datos se procesen en segundo plano mientras la información aún debe presentarse al usuario, lo mejor es poner el proceso en segundo plano en un hilo separado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top