остановка-пауза-продолжение двух синхронизированных потоков - PullRequest
0 голосов
/ 01 февраля 2012

Я создал два потока, работающих вместе с 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 голосов
/ 06 февраля 2012

Наконец, я использовал следующие логические флаги и более старый ответ @Roman Как приостановить поток в Java на неопределенный срок, а затем возобновить его?

0 голосов
/ 01 февраля 2012

На самом деле у вас есть много решений, я постараюсь описать некоторые из них:

вы можете сделать 2 статические логические переменные в main и проверять их в потоках.

Также вы можете создать статическую переменную 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);
...