【发布时间】:2016-03-28 08:27:30
【问题描述】:
在下面的示例中,我试图优雅地终止两个线程。消费者线程在睡眠时被中断,这应该将 isInterrupted 标志设置为 true。但是 !Thread.currentThread().isInterrupted() 对 while 循环的检查似乎仍然返回 = false,因为它不会终止使用者线程。
将以下代码复制粘贴到IDE中进行检查:
public class ThreadInterruptExample {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(1);
ThreadInterruptExample ie = new ThreadInterruptExample();
Producer producer = ie.new Producer(queue);
Consumer consumer = ie.new Consumer(queue, producer);
producer.start();
consumer.start();
Thread.sleep(1000);
producer.cancel();
consumer.cancel();
}
class BaseQueue extends Thread {
protected final BlockingQueue<String> queue;
public BaseQueue(BlockingQueue<String> queue) {
this.queue = queue;
}
public void cancel() {
System.out.println(this.getName() + " - Shutting down");
interrupt();
}
}
class Producer extends BaseQueue {
private final List<String> messages = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
"r", "s", "t", "u", "v", "w", "x", "y", "z");
public Producer(BlockingQueue<String> queue) {
super(queue);
this.setName("Producer");
}
public void run() {
try {
for (String message : messages) {
System.out.println(this.getName() + ": Sending " + message);
queue.put(message);
}
} catch (InterruptedException e) {
System.out.println(this.getName() + " - InterruptedException occurred");
}
}
}
class Consumer extends BaseQueue {
private final BaseQueue producer;
public Consumer(BlockingQueue<String> queue, BaseQueue producerQueue) {
super(queue);
this.setName("Consumer");
producer = producerQueue;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(this.getName() +": Consumer Running");
String message = "";
try {
Thread.sleep(1500);
message = queue.take();
System.out.println(this.getName() + ": Recevied " + message);
if (message.equals("pill")) {
producer.cancel();
this.cancel();
}
} catch (InterruptedException e) {
System.out.print(this.getName() + ": Exception occurred for: " + message);
e.printStackTrace();
}
}
}
}
}
【问题讨论】:
标签: java multithreading