import java.util.Iterator;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
class Student1 implements Runnable, Delayed {
private String name;
private long workTime;
private long submitTime;
private boolean isForce = false;
private CountDownLatch countDownLatch;
public Student1() {
}
public Student1(String name, long workTime, CountDownLatch countDownLatch) {
this.name = name;
this.workTime = workTime;
this.submitTime = TimeUnit.NANOSECONDS.convert(workTime,
TimeUnit.NANOSECONDS) + System.nanoTime();
this.countDownLatch = countDownLatch;
}
@Override
public int compareTo(Delayed o) {
// TODO Auto-generated method stub
if (o == null || !(o instanceof Student1))
return 1;
if (o == this)
return 0;
Student1 s = (Student1) o;
if (this.workTime > s.workTime) {
return 1;
} else if (this.workTime == s.workTime) {
return 0;
} else {
return -1;
}
}
@Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
return unit.convert(submitTime - System.nanoTime(),
TimeUnit.NANOSECONDS);
}
@Override
public void run() {
// TODO Auto-generated method stub
if (isForce) {
System.out.println(name + " 交卷, 希望用时" + workTime + "分钟"
+ " ,实际用时 120分钟");
} else {
System.out.println(name + " 交卷, 希望用时" + workTime + "分钟" + " ,实际用时 "
+ workTime + " 分钟");
}
countDownLatch.countDown();
}
public boolean isForce() {
return isForce;
}
public void setForce(boolean isForce) {
this.isForce = isForce;
}
}
class Endtest extends Student1 {
private DelayQueue
private CountDownLatch countDownLatch;
private Thread teacherThread;
public Endtest(DelayQueue
CountDownLatch countDownLatch, Thread teacherThread) {
super("强制收卷", workTime, countDownLatch);
this.students = students;
this.countDownLatch = countDownLatch;
this.teacherThread = teacherThread;
}
@Override
public void run() {
// TODO Auto-generated method stub
teacherThread.interrupt();
Student1 tmpStudent;
for (Iterator
.hasNext();) {
tmpStudent = iterator2.next();
tmpStudent.setForce(true);
tmpStudent.run();
}
countDownLatch.countDown();
}
}
class Teacher implements Runnable {
private DelayQueue
public Teacher(DelayQueue
this.students = students;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println(" test start");
while (!Thread.interrupted()) {
students.take().run();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public class delayQueueDemo {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
int studentNumber = 30;
CountDownLatch countDownLatch = new CountDownLatch(studentNumber + 1);
DelayQueue
Random random = new Random();
for (int i = 0; i < studentNumber; i++) {
students.put(new Student1("student" + (i + 1), 30 + random
.nextInt(120), countDownLatch));
}
Thread teacherThread = new Thread(new Teacher(students));
students.put(new Endtest(students, 120, countDownLatch, teacherThread));
teacherThread.start();
countDownLatch.await();
System.out.println(" 考试结束,全部交卷!");
}
}