2012-01-31 50 views
0

我已經使兩個線程與Netbeans一起運行,並且我想添加三個按鈕來停止暫停繼續它們。它們突出顯示並取消突出顯示文本。其中一個代碼是停止暫停繼續兩個同步線程

class TimeHighspell extends Thread{ 
    int x=0; 
    int pos; 
    int delay; 
    Control control ; 
    String [] result; 
    int[] anArray; 
    public TimeHighspell (Control c, int delay,String [] result1,int pos,int[] anArray) { 
     x=0; 
     control = c; 
     this.delay = delay; 
     result=result1; 
     this.pos=pos; 
     this.anArray=anArray; 
    } 
public void run(){ 
    while (true) { 
     control.putHighspell(result,pos,x); 
     int Search=x+1; 
     Arrays.sort(anArray); 
     int index = Arrays.binarySearch(anArray,Search); 
     if (index > 0) 
      pos=pos+result[x].length()+1; 
     else 
      pos=pos+result[x].length(); 
     x=x+1; 
     try { 
      Thread.sleep(delay); 
     } 
     catch (InterruptedException e) {} 
    }}} 
class Control { 
    private boolean ping = false; 
    public synchronized void putHigh(String [] result,int pos,int x){  
     while(ping==false) 
      try{ 
       //notify(); 
       wait(); 
      }catch(InterruptedException e){} 
     highlight(editPane, result[x],pos); 
     HighBold(editPane,result[x],pos); 
     ping = false; 
     notifyAll(); 
} 

要啓動它們,我使用AA按鈕,在這裏我把這個代碼

private void HighWordActionPerformed(java.awt.event.ActionEvent evt) {           
    String [] result1 = editPane.getText().split("\\s"); 
    Control c = new Control(); 
    int delay; 
    int pos=0; 
    delay=Slider.getValue(); 
    RemoveHigh p1 = new RemoveHigh(c, delay); 
    TimeHigh c1 = new TimeHigh(c, delay,result1,pos); 
    p1.start(); 
    c1.start();} 
+0

哪裏是你的按鈕GUI代碼? – Jivings 2012-01-31 20:56:08

+1

只需使用兩個volatile boolean字段:'stop'和'pause',並在'while(true)'塊的開始處檢查它們是否正確。 – 2012-01-31 20:58:51

+0

我只是把其餘的代碼 – drew 2012-01-31 21:13:58

回答

0

其實你有很多的解決方案,我會嘗試描述一些:

可以使2爲static在main中使用c布爾變量,並在線程中檢查它們。

你也可以創建一個靜態的字符串變量,並檢查線程中的值。或者,您可以在主線程中放置一個Semaphore,作爲一個靜態字段,而在其他線程中,您可以訪問tryAcquire()方法。

在主你有這樣的代碼:

static public Semaphore semaphore = new Semaphore(2); 

在線程您檢查信號燈的狀態:

while(!semaphore.tryAcquire(2)) { 
    Thread.sleep(100); 
    if(!semaphore.tryAcquire(1)) { 
     //here kill the thread 
    } 
} 

所以在暫停按鈕,你只要把:

semaphore.acquire(1); 

停止按鈕:

semaphore.acquire(2); 

在啓動按鈕:

semaphore.release(2); 
+0

當你在線程中說你的意思是在運行方法?而不是(真)我做檢查? – drew 2012-02-01 00:53:02

+0

不,我的意思是在while(true)循環來檢查信號量 – savionok 2012-02-01 23:42:19