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();
}
}
}