12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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的线程安全队列类的示例代码:
- * <p>
- * 这个线程安全队列类使用了ReentrantLock来控制并发访问,并使用了两个Condition对象,用于阻塞线程,直到队列不再是满的或空闲的。
- * 在enqueue()和dequeue()方法中,使用了try-finally块来确保锁始终被释放。这样,即使发生异常,也能够保证锁被释放,从而避免死锁。
- */
- public class ThreadSafeQueue<T> {
- private Queue<T> 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();
- }
- }
- }
|