2012-02-24 11 views
11

Tengo un programa java que hace algunos cálculos y luego carga los resultados en una base de datos MYSQL (alojada en otra computadora en la misma red). A veces me enfrento al problema de que el programa hace cálculos más rápido de lo que sube el resultado. Por lo tanto, no puede cargar todos los resultados. El programa actualmente no está enhebrado.Haga que un programa java duerma sin enhebrar

¿Hay alguna manera de hacer que el programa duerma durante unos milisegundos después de que ha realizado los cálculos para que la carga se realice correctamente? (Como en otros idiomas, la función de espera o de espera)

Puedo enhebrar el programa, pero eso será demasiada reescritura. hay una manera mas facil?

Gracias

+4

Tengo curiosidad acerca de cómo un programa de un solo subproceso puede hacer algo más rápido que el otro y de alguna manera falla debido a problemas de temporización. Si tiene un solo hilo, estas operaciones son secuenciales. ¿Estás usando una biblioteca o algo para subir que funciona en un hilo diferente o algo así? Si realmente es de un solo hilo, este escenario en realidad no tiene sentido. – Robin

+0

@Robin: Creo que la única forma posible es si la aplicación de Ankur se está registrando o realizando algún tipo de proceso asincrónico. Una aplicación de un único subproceso podría estar en un solo subproceso de lógica que se interrumpe por algún evento asíncrono. Aún así, Sleep no debería ser la primera idea para tratar de solucionar el problema. –

+0

Estoy usando API de terceros en mi programa. Probablemente estén creando subprocesos en el programa que causa la asincronización. – Ank

Respuesta

10

¿Hay alguna manera de hacer que el programa de sueño durante unos milisegundos después de que ha hecho los cálculos de manera que la carga se lleva a cabo correctamente. (Al igual que en otros idiomas duermen o función de espera)

Thread.sleep(milliseconds) es un método estático público que trabajará con programas de un solo subproceso también. Algo parecido a lo siguiente es un patrón típico:

try { 
    // to sleep 10 seconds 
    Thread.sleep(10000); 
} catch (InterruptedException e) { 
    // recommended because catching InterruptedException clears interrupt flag 
    Thread.currentThread().interrupt(); 
    // you probably want to quit if the thread is interrupted 
    return; 
} 

No hay necesidad de implementar Runnable o hacer cualquier otra cosa con llamadas de rosca. Puede llamarlo en cualquier momento para poner una pausa en algún código.

+0

¿Implemento Runnable en mi clase principal? – Ank

9

No tiene que volver a enhebrar ni nada de eso. Todo lo que necesita hacer es llamar:

Thread.Sleep(5000); // pause the app for 5 seconds 

Cada aplicación es también un hilo, en su caso, también llamado una aplicación de un solo subproceso. Puede usar una API de subprocesamiento como Dormir sin ningún otro código o refactorización.

Nota importante de precaución: Si necesita utilizar Thread.Sleep para administrar su flujo de control, es probable que algo vaya mal arquitectónicamente. Desde su OP me preocupa que, en lo que usted describe como una aplicación de subproceso único, parezca que tiene una operación "superando" a otra. Esto no debería ser posible, a menos que esté recibiendo eventos de asincronización de otra parte.

Otra advertencia: el sueño toma un parámetro de milisegundo que, por lo general, es arbitrario y solo significa "espere un momento". El problema es que un "pequeño momento" puede estar bien hoy, pero mañana su máquina estará bajo mayor carga y "un momento" ya no será lo suficientemente bueno, su suspensión caducará y aparecerá el mismo error. Claro, puede establecer el tiempo de espera en "un largo tiempo" pero luego estará esperando "un largo tiempo" para cada transacción ... Captura 22.

+0

¿Qué quiere decir con que probablemente algo anda mal arquitectónicamente? ¡Lo siento, no lo entendí! – Ank

+3

@Ankur: ver mi edición reciente. Thread.Sleep suele ser un truco para solucionar un problema de temporización. Si el código es todo tuyo, entonces el problema del tiempo habrá sido de tu propia creación. Es decir. Dormir está bien para hackear API de terceros y servicios sobre los que no tienes control, pero si posees el código, no te apresures a usarlo demasiado rápido. –

+0

Tengo el código, pero estoy usando la API de MySQL y otra API de terceros. ¿Recomiendas Thread.Sleep()? – Ank

0

El método estático sleep() en la clase java.lang.Thread hace una pausa el hilo actual, que podría ser el hilo principal, cuando se lo llama. No necesita hacer nada especial para usarlo.

3

Uso Thread.sleep():

try 
{ 
    Thread.sleep(1000); // Sleep for one second 
} 
catch (InterruptedException e) 
{ 
    Thread.currentThread().interrupt(); 
} 

Esto no introduce un nuevo Thread en el programa o requiere ningún otro Thread su maquinaria.

+0

FYI: Se recomienda llamar a Thread.currentThread(). interrupt(); si capturas 'InterruptedException'. Ver: http://stackoverflow.com/questions/4906799/why-invoke-thread-currentthread-interrupt-when-catch-any-interruptexception – Gray

+0

@Gray, gracias. No estaba consciente de eso. Respuesta actualizada – hmjd

1

sólo tiene que utilizar: -

try 
{ 
Thread.sleep(<time in ms>); 
} 
catch(InterruptedException ex} 
{ 
} 

Esto hará que el hilo actual (por ejemplo, hilo principal) del sueño.

+0

¿Implemento Runnable en mi clase principal? – Ank

+1

No, no es necesario implementar Runnable.El código anterior llama a un método estático para dormir por un tiempo, que sucede que está en la clase Thread. Esto no está realmente enhebrando tu código. – Martin

+1

@Ankur No, Thread.sleep() es solo un método estático regular, desafortunadamente se llama así porque no tiene nada que ver con el enhebrado. –

0

Cada aplicación Java se ejecuta en una cadena en la JVM. Al llamar al método estático Thread.sleep hará que el hilo de la aplicación (el que está en marcha) para detener no Multi

0

Su programa se -enhebrado ... pero está utilizando un hilo. Thread.Sleep todavía funcionará.

0

¡Puede usar Thread.sleep(); después del cálculo sin la necesidad de reescribir todo su programa con hilos!

Cuestiones relacionadas