package cn.cslg.pas.service.upLoadPatent; import cn.cslg.pas.common.model.dto.UploadFileDTO; import cn.cslg.pas.common.model.vo.TaskParams; import cn.cslg.pas.common.model.vo.UploadParamsVO; import cn.cslg.pas.common.utils.FileUtils; import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils; import cn.cslg.pas.service.TaskService; import cn.hutool.core.collection.IterUtil; import cn.hutool.poi.excel.ExcelUtil; import org.springframework.web.multipart.MultipartFile; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 以下是一个基于Java的线程安全队列类的示例代码: *

* 这个线程安全队列类使用了ReentrantLock来控制并发访问,并使用了两个Condition对象,用于阻塞线程,直到队列不再是满的或空闲的。 * 在enqueue()和dequeue()方法中,使用了try-finally块来确保锁始终被释放。这样,即使发生异常,也能够保证锁被释放,从而避免死锁。 */ public class ThreadSafeQueue { private Queue queue = new LinkedList<>(); private final Lock lock = new ReentrantLock(); private final Condition notEmpty = lock.newCondition(); private final Condition notFull = lock.newCondition(); private int maxSize; public ThreadSafeQueue(int maxSize) { this.maxSize = maxSize; } public void enqueue(T item) throws InterruptedException { lock.lock(); try { while (queue.size() == maxSize) { notFull.await(); } UploadParamsVO up =(UploadParamsVO)item; System.out.println("进入队列"+up.getFirstAddress()); queue.add(item); TimeUnit.MILLISECONDS.sleep(1000); notEmpty.signalAll(); } finally { lock.unlock(); } } public T dequeue() throws InterruptedException { lock.lock(); try { while (queue.isEmpty()) { notEmpty.await(); } UploadParamsVO up =(UploadParamsVO)queue.element(); System.out.println("出队列"+up.getFirstAddress()); T item = queue.remove(); TimeUnit.MILLISECONDS.sleep(2000); notFull.signalAll(); return item; } finally { lock.unlock(); } } }