2010-01-08 5 views
-1

J'ai une classe DataThread hérité de Thread. J'utilise deux objets DataThreadReadThread et WriteThread. J'ai un autre thread où Main_GUI est en cours d'exécution.Appel de sommeil sur le thread courant bloque mon interface graphique principale

Maintenant quand j'appuie sur un bouton sur main_GUI il appelle une méthode x.method1() et ensuite cette méthode utilise la méthode WriteThread WriteThread.sleepForReset(). Dans

public void sleepForReset(){ 
    try { 
     sleep(28000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Lorsque j'appuie sur le bouton sur main_GUI les étals de GUI pour 28000 miliseconds. Si j'appelle le sommeil sur WriteThread alors pourquoi il arrête le main_GUI? Est-ce parce que le sommeil est une méthode statique? Si oui quelqu'un peut-il suggérer comment dormir le WriteThread sans affecter Main_GUI?

Répondre

-1

Merci à vous tous pour m'avoir suggéré différentes options ..... Mais j'ai utilisé TimeTask.schedule() et travaillé. J'ai prévu mon travail pour plus tard au lieu d'utiliser le sommeil dans le fil courant ......

1

Je pense que l'appel de Geeks n'est pas nécessairement un bon moyen d'obtenir de l'aide, mais pour répondre à votre question, vous voyez le sommeil parce que vous appelez Thread.sleep sur le fil de distribution d'événement. Les opérations de l'interface graphique de Swing s'exécutent sur ce thread unique. Si vous avez besoin de travailler en arrière-plan, vous devez le déléguer à un SwingWorker.

En outre, la gestion des exceptions interrompues n'est pas très robuste. À tout le moins, vous devez réinterrompre le thread avec Thread.currentThread(). Interrupt().

+0

Merci pour la suggestion ....... Je n'appellerai jamais n'importe qui "Geek" dans ma vie ... Mais qu'est-ce que je peux faire? Je suis désespéré de l'aide ... :) –

6

Si vous appelez WriteThread.sleepForReset() depuis votre méthode actionPerformed, vous l'appelez réellement à partir du thread EventDispatch. Même si vous avez un objet qui représente votre WriteThread, l'appel d'une méthode sur cet objet à partir du thread EventDispatch entraîne l'exécution du processus dans l'EDT.

Jetez un oeil à this tutorial sur l'utilisation des threads de travail en Java. Notez qu'il n'est pas suffisant d'avoir une classe qui hérite de Thread, vous devez avoir démarré les instances de ces Threads pour avoir une application multithread. Le tutoriel fourni vous donnera une bonne idée sur un moyen de commencer.

Questions connexes