2012-03-30 6 views
3

Ist es möglich, Warteverfahren für einen anderen Thread, anstatt der aktuellen thread.what ich frage ist zu nennen so etwas wie dieses:Warte Anruf für einen bestimmten Thread

Code:

public class a extends JApplet{ 
JButton start= new JButton("Start"); 
JButton wait= new JButton("Wait"); 
JButton notify = new JButton("Notify"); 
final Thread bthread = new Thread(new B(), "BThread"); 

@Override 
public void init(){ 
    //start 
    this.getContentPane().setLayout(new FlowLayout()); 
    start.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Started"); 
     } 
    }); 
    this.getContentPane().add(start); 
    //wait 
    wait.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Waited"); 
      synchronized(bthread)  //something like this 
      { 
       try { 
        bthread.wait();  //is it possible instead of the current thread the bthread get invoke 
       } catch (Exception ex) { 
        Logger.getLogger(a.class.getName()).log(Level.SEVERE, null, ex); 
       }} 
     } 
    }); 
    this.getContentPane().add(wait); 

    //notify 
    notify.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Notified"); 
      synchronized(a.this){ 
      a.this.notify(); 
      }} 
    }); 
    this.getContentPane().add(notify); 
} 
class B implements Runnable 
{ 
    int i=0; 
    @Override 
    public void run() { 
     while(i<10){ 
      System.out.println(" i = "+i); 
      // i++; 
     } 
    } 
} 
} 

Ist es möglich, dass, wenn die Schaltfläche "Warten" geklickt wird, der bthread in den Wartezustand geht?

Antwort

6

möchten Sie bthread, um tatsächlich seine Ausführung zu pausieren, was auch immer es tut? Das kann man nicht, AFAIK. Sie können jedoch bthread Polling auf einem freigegebenen statusbehafteten Synchronisationsobjekt setzen (zB CountDownLatch oder Semaphore, schauen Sie in das java.util.concurrent Paket), so dass Sie den Status des Objekts ändern, um bthread zu warten.

1

Ich denke nicht. Thread B kann eine Variable überprüfen, zum Beispiel boolsche Pause; Wenn es wahr ist, kann es warten. Es muss flüchtig sein oder muss synchronisiert werden und es ist etwas erforderlich, um es aufzuwecken, aber das hängt davon ab, was Sie tun wollen.

Aber wenn Thread B eine lange Operation ausführt, kann es lange dauern, bevor es überprüft, ob es warten soll.

3

Nein. Sie können einen solchen Thread nicht anhalten.

Aber Sie können eine Warte Methode in der B-Klasse implementieren:

class B implements Runnable 
{ 
    private boolean wait = false; 

    public void pause() { 
    wait = true; 
    } 

    int i=0; 
    @Override 
    public void run() { 
     while(i<10){ 
      if (wait) { 
       wait(); 
      } 
      System.out.println(" i = "+i); 
      // i++; 
     } 
    } 
} 
1

Nein, können Sie nur den aktuellen Thread steuern, wenn Sie auf einem anderen Thread warten Sie eigentlich wait() aufrufen, indem das Objekt (die Thread, auf den Sie sich beziehen) als Monitor. Sie müssen also entweder eine Zeitüberschreitung vornehmen oder eine Unterbrechung für dieses Objekt aufrufen, damit Ihr aktueller Thread erneut gestartet wird.

Sie müssen diese Logik in Ihr Programm einbauen, so dass sie wartet, nachdem eine Variable oder Nachricht markiert wurde. Ein anderer Weg wäre die Verwendung von Schlössern oder Semaphoren.

Sie könnten auch Interrupt auf diesem Thread aufrufen, wenn Sie möchten, dass es stoppt, aber diese Logik muss auch in Ihr Programm eingebaut werden, da es möglicherweise eine InterruptedException auslöst, wenn der Thread IO ausführt.