我有一个简单的GUI,其中有两个按钮:Print
和Stop
。
当用户按下print
时,已经保存的号码连续打印。
当用户按下Stop
时,打印停止。
我在一个单独的线程中处理数字的打印,因为我需要线程在再次打印之前休眠一毫秒。
printBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Thread a= new Thread(new Runnable(){
public void run(){
textArea.setText("");
for (int i=0; i<10; i++){
int result= 0;
System.out.println(result+"\n");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
a.start();
}
});
现在在Stop按钮的ActionListener中,我希望第一个线程被中断或停止。 我该怎么做,因为它需要从另一个线程中断?< /强>
答案 0 :(得分:1)
如果您的第一个线程不包含线程阻塞操作,您可以检查for
- 循环中的标志,当您按下&#34;停止&#时,该标志将设置为true
34; - 按钮
public class WriterThread implements Runnable {
private volatile boolean stopped = false;
public synchronized void stop() {
this.stopped = true;
}
public void run(){
textArea.setText("");
for (int i=0; i<10; i++) {
if (this.stopped) {
break;
}
int result= 0;
System.out.println(result+"\n");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
答案 1 :(得分:1)
使用AtomicBoolean
作为标记。它将确保线程安全。
Runnable r= new Runnable(){
private AtomicBoolean stop= new AtomicBoolean(false);
public void run(){
for(...){
if(stop.get()){
break; // break the loop
}
...
}
}
public stop(){
stop.set(true);
}
}
Thread a= new Thread(r);
a.start();
r.stop();
答案 2 :(得分:1)
final Thread a= new Thread(new Runnable(){
public void run(){
try {
textArea.setText("");
for (int i=0; i<10; i++){
int result= 0;
System.out.println(result+"\n");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// ignore
}
}
});
printBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
a.start();
}
});
stopBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if( a.isAlive() ) {
a.interrupt();
}
}
});