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