2012-02-24 16 views
11

Ho un programma java che esegue alcuni calcoli e quindi carica i risultati in un database MySQL (ospitato in un altro computer nella stessa rete). A volte devo affrontare il problema che il programma esegue calcoli più velocemente di quanto non carichi il risultato. Pertanto non è in grado di caricare tutti i risultati. Il programma al momento non è threaded.Far funzionare un programma java senza threading

C'è un modo per rendere il programma inattivo per alcuni millisecondi dopo aver eseguito i calcoli in modo che il caricamento avvenga correttamente. (Come in altre lingue, la funzione sleep o wait)

Posso eseguire il programma, ma riscriverò troppo. C'è un modo più semplice?

Grazie

+4

Sono curioso di sapere come un programma a thread singolo può eseguire una cosa più velocemente dell'altro e in qualche modo ha esito negativo a causa di problemi di temporizzazione. Se è a thread singolo, queste operazioni sono sequenziali. Stai usando una libreria o qualcosa da caricare che funziona in un thread diverso o qualcosa del genere? Se è veramente single threaded, questo scenario non ha realmente senso. – Robin

+0

@Robin: Penso che l'unico modo è possibile se l'app di Ankur si sta registrando o sta eseguendo una sorta di processo asincrono. Un'app a thread singolo potrebbe trovarsi in un singolo thread di logica interrotto da un evento asincrono. Tuttavia, Sleep non dovrebbe essere la prima idea di provare a risolvere il problema. –

+0

Uso le API di terze parti nel mio programma. Stanno probabilmente creando thread nel programma che causa l'asincrono. – Ank

risposta

10

C'è un modo per rendere il sonno programma per alcuni millisecondi dopo che ha fatto i calcoli in modo che il caricamento avviene correttamente. (Come in altre lingue dormire o funzione di attesa)

Thread.sleep(milliseconds) è un metodo statico pubblico che funzionerà con i programmi a thread singolo, pure. Qualcosa come il seguente è un modello tipico:

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; 
} 

Non c'è necessità di attuare Runnable o fare qualsiasi altra cosa con thread chiama. Puoi chiamarlo in qualsiasi momento per mettere una pausa in qualche codice.

+0

Implementare Runnable nella mia classe principale? – Ank

9

Non è necessario ripetere il thread o qualcosa del genere. Tutto quello che dovete fare è chiamare:

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

Ogni applicazione è anche un filo, nel tuo caso chiamato anche un single-threaded app. Puoi utilizzare un'API di threading come Sleep con qualsiasi altro codice o refactoring.

Grande nota di cautela però: Se è necessario utilizzare Thread.Sleep per gestire il flusso di controllo, è probabile che qualcosa vada storto dal punto di vista dell'architettura. Dal tuo OP sono interessato rispetto a quello che descrivi come un'applicazione a thread singolo, sembra che tu abbia una operazione che "supera" un'altra. Questo non dovrebbe essere possibile, a meno che tu non stia ricevendo eventi asincroni da altrove.

Un altro avvertimento: il sonno richiede un parametro di millisecondo che di solito è arbitrario e significa semplicemente "aspetta un po '." Il problema è che un "po 'di tempo" può essere OK oggi, ma domani la tua macchina sarà sottoposta a un carico maggiore e "un po' di tempo" non sarà più sufficiente, il tuo Sonno si spegnerà e comparirà lo stesso errore. Certo, puoi impostare il timeout su "un lungo periodo", ma poi attendi "a lungo" per ogni transazione ... Catch 22.

+0

Che cosa intendi perché probabilmente c'è qualcosa che va storto architettonicamente? Scusa, non l'ho capito !! – Ank

+3

@Ankur: vedere la mia recente modifica. Thread.Sleep è solitamente un trucco per risolvere un problema di temporizzazione. Se il codice è tutto tuo, allora il problema di temporizzazione sarà stato di tua creazione. Cioè Dormi bene per hackerare le API e i servizi di terze parti su cui non hai alcun controllo, ma se possiedi il codice, non correre a usarlo troppo velocemente. –

+0

Possiedo il codice ma sto utilizzando l'API MySQL e un'altra API di terze parti. Raccomanderesti Thread.Sleep()? – Ank

0

Il metodo statico sleep() nelle pause di classe java.lang.Thread il thread corrente - che potrebbe essere solo il thread principale - quando chiamato. Non devi fare nulla di speciale per usarlo.

3

Uso Thread.sleep():

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

Questo non introduce un nuovo Thread nel programma o richiedere qualsiasi altro Thread dei relativi dispositivi.

+0

FYI: Si consiglia di chiamare Thread.currentThread(). interrupt(); se si cattura 'InterruptedException'. Vedi: http://stackoverflow.com/questions/4906799/why-invoke-thread-currentthread-interrupt-when-catch-any-interruptexception – Gray

+0

@Gray, grazie. Non ne ero a conoscenza. Risposta aggiornata – hmjd

1

Basta usare: -

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

Questo renderà il thread corrente (per esempio filo principale) del sonno.

+0

Implementare Runnable nella mia classe principale? – Ank

+1

No, non è necessario implementare Runnable.Il codice precedente sta chiamando un metodo statico per dormire per un po ', cosa che accade nella classe Thread. Questo non è in realtà il threading del codice. – Martin

+1

@Ankur No, Thread.sleep() è solo un metodo statico normale, è piuttosto sfortunatamente chiamato poiché non ha nulla a che fare con il threading. –

0

Ogni applicazione Java viene eseguita in una discussione nella JVM. Chiamando il metodo statico Thread.sleep causerà l'interruzione del thread dell'applicazione (quello in esecuzione)

0

Il tuo programma non è Multi -threaded ... ma sta utilizzando una discussione. Thread.Sleep funzionerà ancora.

0

È possibile utilizzare Thread.sleep(); dopo il calcolo senza la necessità di riscrivere l'intero programma con i thread!

Problemi correlati