| | |
| | | |
| | | /** |
| | | * @ClassName QueueManager |
| | | * @Description: 队列管理 |
| | | * @Description: 队列管理-----弃用 |
| | | * @Author 刘苏义 |
| | | * @Date 2023/6/29 21:09 |
| | | * @Version 1.0 |
| | |
| | | @Slf4j(topic = "guideQueue") |
| | | public class QueueManager { |
| | | |
| | | @Autowired |
| | | private QueueTaskExecutor taskExecutor; |
| | | private Map<String, TaskThread> threadMap = new ConcurrentHashMap<>(); |
| | | // @Autowired |
| | | // private QueueTaskExecutor taskExecutor;-----弃用 |
| | | // private Map<String, TaskThread> threadMap = new ConcurrentHashMap<>(); |
| | | |
| | | /*内部静态类*/ |
| | | private static class TaskThread { |
| | | private Thread thread; |
| | | private GuideTask currentTask; |
| | | |
| | | public TaskThread(Thread thread, GuideTask currentTask) { |
| | | this.thread = thread; |
| | | this.currentTask = currentTask; |
| | | } |
| | | |
| | | public Thread getThread() { |
| | | return thread; |
| | | } |
| | | |
| | | public GuideTask getCurrentTask() { |
| | | return currentTask; |
| | | } |
| | | |
| | | public void setCurrentTask(GuideTask task) { |
| | | this.currentTask = task; |
| | | } |
| | | } |
| | | ///*内部静态类*/ |
| | | //private static class TaskThread { |
| | | // private Thread thread; |
| | | // private GuideTask currentTask; |
| | | // |
| | | // public TaskThread(Thread thread, GuideTask currentTask) { |
| | | // this.thread = thread; |
| | | // this.currentTask = currentTask; |
| | | // } |
| | | // |
| | | // public Thread getThread() { |
| | | // return thread; |
| | | // } |
| | | // |
| | | // public GuideTask getCurrentTask() { |
| | | // return currentTask; |
| | | // } |
| | | // |
| | | // public void setCurrentTask(GuideTask task) { |
| | | // this.currentTask = task; |
| | | // } |
| | | //} |
| | | |
| | | /** |
| | | * 引导任务入队 |
| | |
| | | } |
| | | log.debug("新任务入队:" + task.getAlarmId()); |
| | | guideTaskQueue.add(task); |
| | | /*获取该相机的当前执行线程*/ |
| | | TaskThread currentTaskThread = threadMap.get(cameraId); |
| | | //如果队列当前线程正在运行,若入队任务优先级大于当前任务优先级,则终止当前线程 |
| | | if (currentTaskThread != null){ |
| | | if (task.getPriority() > currentTaskThread.getCurrentTask().getPriority()) { |
| | | currentTaskThread.getThread().interrupt(); |
| | | } |
| | | if (!currentTaskThread.getThread().isAlive()) { |
| | | Thread newThread = createThread(cameraId, guideTaskQueue); |
| | | threadMap.put(cameraId, new TaskThread(newThread, task)); |
| | | newThread.start(); |
| | | } |
| | | } |
| | | //如果队列当前没有线程正在运行,则启动新线程 |
| | | else { |
| | | Thread newThread = createThread(cameraId, guideTaskQueue); |
| | | threadMap.put(cameraId, new TaskThread(newThread, task)); |
| | | newThread.start(); |
| | | } |
| | | /*获取该相机的当前执行线程-----弃用*/ |
| | | //TaskThread currentTaskThread = threadMap.get(cameraId); |
| | | ////如果队列当前线程正在运行,若入队任务优先级大于当前任务优先级,则终止当前线程 |
| | | //if (currentTaskThread != null){ |
| | | // if (task.getPriority() > currentTaskThread.getCurrentTask().getPriority()) { |
| | | // currentTaskThread.getThread().interrupt(); |
| | | // } |
| | | // if (!currentTaskThread.getThread().isAlive()) { |
| | | // Thread newThread = createThread(cameraId, guideTaskQueue); |
| | | // threadMap.put(cameraId, new TaskThread(newThread, task)); |
| | | // newThread.start(); |
| | | // } |
| | | //} |
| | | ////如果队列当前没有线程正在运行,则启动新线程 |
| | | //else { |
| | | // Thread newThread = createThread(cameraId, guideTaskQueue); |
| | | // threadMap.put(cameraId, new TaskThread(newThread, task)); |
| | | // newThread.start(); |
| | | //} |
| | | } |
| | | |
| | | /** |
| | | * 创建线程 |
| | | * 创建线程 -----弃用 |
| | | * 刘苏义 |
| | | * 2023/6/30 9:04 |
| | | */ |
| | | private Thread createThread(String queueName, PriorityBlockingQueue<GuideTask> queue) { |
| | | |
| | | return new Thread(() -> { |
| | | while (!Thread.currentThread().isInterrupted()) { |
| | | try { |
| | | GuideTask task = queue.take(); |
| | | log.debug("取出队列数据:" + task.getAlarmId()); |
| | | taskExecutor.processTask(task); |
| | | // 更新线程的当前任务 |
| | | TaskThread currentTaskThread = threadMap.get(queueName); |
| | | if (currentTaskThread != null) { |
| | | currentTaskThread.setCurrentTask(task); |
| | | } |
| | | } catch (InterruptedException e) { |
| | | log.info("中断当前线程"); |
| | | //线程中断,退出循环 |
| | | Thread.currentThread().interrupt(); |
| | | } |
| | | } |
| | | }, queueName); |
| | | } |
| | | //private Thread createThread(String queueName, PriorityBlockingQueue<GuideTask> queue) { |
| | | // |
| | | // return new Thread(() -> { |
| | | // while (!Thread.currentThread().isInterrupted()) { |
| | | // try { |
| | | // GuideTask task = queue.take(); |
| | | // log.debug("取出队列数据:" + task.getAlarmId()); |
| | | // taskExecutor.processTask(task); |
| | | // // 更新线程的当前任务 |
| | | // TaskThread currentTaskThread = threadMap.get(queueName); |
| | | // if (currentTaskThread != null) { |
| | | // currentTaskThread.setCurrentTask(task); |
| | | // } |
| | | // } catch (InterruptedException e) { |
| | | // log.info("中断当前线程"); |
| | | // //线程中断,退出循环 |
| | | // Thread.currentThread().interrupt(); |
| | | // } |
| | | // } |
| | | // }, queueName); |
| | | //} |
| | | } |