2012-01-31 87 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