001 package com.hammurapi.reasoning.impl;
002
003 import java.util.ArrayList;
004 import java.util.List;
005 import java.util.concurrent.Callable;
006 import java.util.concurrent.atomic.AtomicInteger;
007
008 import com.hammurapi.util.concurrent.NonBlockingNotifyingFutureTask;
009 import com.hammurapi.util.concurrent.TaskCounter;
010
011 public class NonBlockingPriorityNotifyingFutureTask<V, A> extends NonBlockingNotifyingFutureTask<V> implements Comparable<NonBlockingPriorityNotifyingFutureTask<V, A>> {
012
013 private static final AtomicInteger counter = new AtomicInteger();
014
015 private List<InferenceToken<Object>> inferenceTokens = new ArrayList<InferenceToken<Object>>();
016 private int priority;
017 private int serno;
018
019 @SuppressWarnings("unchecked")
020 public NonBlockingPriorityNotifyingFutureTask(Callable<V> callable, TaskCounter taskCounter, A[] args, int priority) throws InterruptedException {
021 super(callable, taskCounter);
022 this.priority = priority;
023 for (A arg: args) {
024 if (arg instanceof InferenceToken<?>) {
025 ((InferenceToken<?>) arg).taskCreated(priority);
026 inferenceTokens .add((InferenceToken<Object>) arg);
027 }
028 }
029 serno = counter.incrementAndGet();
030 }
031
032 @Override
033 public void run() {
034 try {
035 super.run();
036 } finally {
037 for (InferenceToken<Object> it: inferenceTokens) {
038 it.taskFinished(priority);
039 }
040 }
041 }
042
043 @Override
044 public int compareTo(NonBlockingPriorityNotifyingFutureTask<V, A> o) {
045 int priorityDifference = o.priority - priority;
046 if (priorityDifference!=0) {
047 return priorityDifference;
048 }
049 return serno - o.serno;
050 }
051
052
053 }