2012-03-30 146 views
3

是否可以調用wait方法,另一個線程,而不是目前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輪詢某些共享狀態同步對象(例如,CountDownLatchSemaphore或查看java.util.concurrent程序包),以便更改對象的狀態以設置bthread等待。

1

我不這麼認爲。線程B可以檢查一些變量,例如布爾值暫停;如果它是真的,它可以等待。它需要不穩定或需要同步,並且需要將其喚醒,但這取決於您希望執行的操作。

但是,如果線程B正在做一些長時間的操作,它可能會運行很長時間纔會檢查它是否應該等待。

3

不可以。您不能暫停這樣的線程。

但你可以實現在B類中的wait方法:)使用該對象

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

不行,你只能控制當前線程,如果你等待你實際調用wait(另一個線程(你所指的線程)作爲顯示器。所以你要麼必須超時,要麼有人在該對象上調用中斷,以使當前線程再次啓動。

你必須建立一個邏輯到你的程序,使其等待一個變量或消息後進行標記。另一種方法是使用鎖或信號量。

你也可以撥打該線程中斷,如果你想讓它停下來,但邏輯也必須內置到你的程序,因爲它可能只是拋出一個InterruptedException如果線程在做IO。