Я видел очень хорошее объяснение от «thedarkpassenger» о том, как реализовать PrioirtyQueue в многопоточном приложении, однако после этого был только один запускаемый класс
Что, если нам нужно реализовать несколько классов Runnable? Как изменить класс MyFutureTask и main для размещения нескольких классов Runnable?
Класс драйвера: этот класс создает исполнителя, который принимает задачи и позже отправляет их на выполнение. Здесь мы создаем две задачи: одну с НИЗКИМ приоритетом, а другую с ВЫСОКИМ приоритетом. Здесь мы говорим исполнителю запустить MAX из 1 потока и использовать PriorityBlockingQueue.
public static void main(String[] args) {
/*
Minimum number of threads that must be running : 0
Maximium number of threads that can be created : 1
If a thread is idle, then the minimum time to keep it alive : 1000
Which queue to use : PriorityBlockingQueue
*/
PriorityBlockingQueue queue = new PriorityBlockingQueue();
ThreadPoolExecutor executor = new ThreadPoolExecutor(0,1,
1000, TimeUnit.MILLISECONDS,queue);
MyTask task = new MyTask(Priority.LOW,"Low");
executor.execute(new MyFutureTask(task));
task = new MyTask(Priority.HIGH,"High");
executor.execute(new MyFutureTask(task));
}
Класс MyTask: MyTask реализует Runnable и принимает приоритет в качестве аргумента в конструкторе. Когда эта задача выполняется, она печатает сообщение, а затем переводит поток в спящий режим на 1 секунду.
public class MyTask implements Runnable {
public int getPriority() {
return priority.getValue();
}
private Priority priority;
public String getName() {
return name;
}
private String name;
public MyTask(Priority priority,String name){
this.priority = priority;
this.name = name;
}
@Override
public void run() {
System.out.println("The following Runnable is getting executed "+getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Класс MyFutureTask: поскольку мы используем PriorityBlocingQueue для хранения наших задач, наши задачи должны быть заключены в FutureTask, а наша реализация FutureTask должна реализовывать интерфейс Comparable. Интерфейс Comparable сравнивает приоритет двух разных задач и отправляет на выполнение задачу с наивысшим приоритетом.
public class MyFutureTask extends FutureTask<MyFutureTask>
implements Comparable<MyFutureTask> {
private MyTask task = null;
public MyFutureTask(MyTask task){
super(task,null);
this.task = task;
}
@Override
public int compareTo(MyFutureTask another) {
return task.getPriority() - another.task.getPriority();
}
}
Приоритетный класс: Не требует пояснений Приоритетный класс.
public enum Priority {
HIGHEST(0),
HIGH(1),
MEDIUM(2),
LOW(3),
LOWEST(4);
int value;
Priority(int val) {
this.value = val;
}
public int getValue(){
return value;
}
}
Теперь, когда мы запускаем этот пример, мы получаем следующий результат
Следующий Runnable запускается с высоким уровнем Следующий Runnable запускается на низком уровне
Получил ответ.




Слегка сбивает с толку ваш наивысший приоритет имеет самый низкий приоритетный номер и наоборот.