在主题中我是否正确关闭了这些同步线程?
我分配了一个volatile字段并在while循环中重复检查。
有没有替代方法(比如使用synchronize或wait()方法),请告诉我。
编辑我编辑了代码。有没有办法通过isAlive();?的不同方法检查Thread是否存活? 也许:
boolean isAlive(){
return running;
}
import javax.swing.JOptionPane;
public class Wat extends Thread {
private char c;
private int interv;
private volatile boolean running = true;
Object synchObj;
public Wat(char c, int interv) {
this.c = c;
this.interv = interv;
synchObj = new Object();
}
public void run() {
while (running) {
synchronized (synchObj) {
try {
showChar(c);
synchObj.wait(interv * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public synchronized static void showChar(char c) {
System.out.println(c);
}
public void shutdown() {
running = false;
synchronized (synchObj) {
synchObj.notify();
}
}
public static void main(String[] args) throws InterruptedException {
Wat w1 = new Wat('A', 3);
Wat w2 = new Wat('B', 4);
Wat w3 = new Wat('C', 5);
w1.start();
w2.start();
w3.start();
Object[] options = { "Shutdown A", "Shutdown B", "Shutdown C" };
int option;
while (w1.isAlive() || w2.isAlive() || w3.isAlive()) {
option = JOptionPane.showOptionDialog(null,
"Which one would you like to shut?", "Threads",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options, options[2]);
switch (option) {
case JOptionPane.YES_OPTION:
w1.shutdown();
break;
case JOptionPane.NO_OPTION:
w2.shutdown();
break;
case JOptionPane.CANCEL_OPTION:
w3.shutdown();
break;
}
Thread.sleep(1);
}
}
}
答案 0 :(得分:4)
您的代码可能正常工作,但Thread.sleep不是很优雅。我会沿着这些方向做一些事情,调用shutdown()方法退出线程
Object synchObj = new Object();
public void run() {
while (running) {
synchronized (synchObj) {
try {
System.out.println(new Date());
synchObj.wait(5000);
} catch (InterruptedException e) {
// error handling
}
}
}
}
public void shutdown() {
running = false;
synchronized (synchObj) {
synchObj.notify();
}
}
public static void main(String[] args) throws InterruptedException,
IOException {
ThreadTest test = new ThreadTest();
test.start();
BufferedReader tReader = new BufferedReader(new InputStreamReader(
System.in));
tReader.readLine();
test.shutdown();
}
编辑添加了测试代码
答案 1 :(得分:3)
是的,您正在正确关闭线程。唯一的评论是你在这里打破了包围,因为直接访问了标志running
。我建议您添加将此标记更改为shutdown()
的方法false
。
EDIT。
我刚刚注意到你在循环中调用了sleep()
。在大多数情况下,这确实是不好的做法。你应该打电话给wait(timeout)
。在这种情况下,您的shutdown()
方法会将标记更改为false
,然后在同一监视器上调用notify()
。这将导致您的线程立即退出。
答案 2 :(得分:0)
程序似乎很完美,使用volatile布尔变量并使其成为假。
同步只需要多线程访问。而不是睡眠,你可以使用等待,它有一个对象访问而不是静态睡眠,也可以在任何时候中断等待。