2012-03-30 5 views
3

Можно ли вызвать метод ожидания другого потока, а не текущей thread.what я спрашиваю что-то вроде этого:ожидание вызова для конкретного потока

Код:

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

Можно что, когда нажата кнопка ожидания, bthread переходит в состояние ожидания?

ответ

6

Вы хотите, чтобы bthread фактически приостановил его выполнение, что бы он ни делал? Это невозможно сделать, AFAIK. Тем не менее, вы можете установить опрос bthread на каком-то объекте синхронизации с общим состоянием (например, CountDownLatch или Semaphore). Посмотрите на пакет java.util.concurrent), чтобы вы изменили статус объекта, чтобы установить bthread ожидания.

1

Я так не думаю. Резьба B может проверять некоторую переменную, например boolean pause; Если это правда, это может подождать. Он должен быть изменчивым или нуждается в синхронизации, и что-то, что нужно для его пробуждения, необходимо, но это зависит от того, что вы хотите.

Но если поток В выполняет долгую операцию, он может работать много времени, прежде чем он проверяет, следует ли ждать.

3

Нет. Вы не можете приостановить подобный поток.

Но вы можете реализовать метод ожидания в классе B:

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

Нет, вы можете только контролировать текущую нить, если вы будете ждать в другом потоке вы на самом деле ожидание вызова(), используя этот объект (к которому вы обращаетесь) в качестве монитора. Таким образом, вам либо приходится тайм-аут, либо кто-то вызывает прерывание на этом объекте, чтобы возобновить текущий поток.

Вы должны построить эту логику в своей программе, заставляя ее ждать после того, как будет отмечена переменная или сообщение. Другой способ - использовать блокировки или семафоры.

Вы также можете вызвать прерывание в этом потоке, если хотите, чтобы он остановился, но эта логика также должна быть встроена в вашу программу, так как это может просто вызвать InterruptedException, если поток выполняет IO.

Смежные вопросы