stop-pause-continue两个同步的线程

时间:2012-01-31 20:54:43

标签: java multithreading wait

我已经和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();
}

要启动它们,我使用一个按钮放置此代码

 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();}

2 个答案:

答案 0 :(得分:0)

实际上你有很多解决方案,我会尝试描述其中的一些:

你可以在main中制作2个静态布尔变量,并在线程中检查它们。

此外,您可以创建一个静态String变量,并检查线程中的值。

或者,你可以将一个信号量放在主线程中,作为一个静态字段,在其他线程中你可以访问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);

答案 1 :(得分:0)

最后,我使用了@Roman之后的逻辑标志和较旧的答案 How to indefinitely pause a thread in Java and later resume it?