ThreadSafeQueue.java 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package cn.cslg.pas.service.upLoadPatent;
  2. import cn.cslg.pas.common.model.dto.UploadFileDTO;
  3. import cn.cslg.pas.common.model.vo.TaskParams;
  4. import cn.cslg.pas.common.model.vo.UploadParamsVO;
  5. import cn.cslg.pas.common.utils.FileUtils;
  6. import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils;
  7. import cn.cslg.pas.service.TaskService;
  8. import cn.hutool.core.collection.IterUtil;
  9. import cn.hutool.poi.excel.ExcelUtil;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import java.util.*;
  12. import java.util.concurrent.TimeUnit;
  13. import java.util.concurrent.locks.Condition;
  14. import java.util.concurrent.locks.Lock;
  15. import java.util.concurrent.locks.ReentrantLock;
  16. /**
  17. * 以下是一个基于Java的线程安全队列类的示例代码:
  18. * <p>
  19. * 这个线程安全队列类使用了ReentrantLock来控制并发访问,并使用了两个Condition对象,用于阻塞线程,直到队列不再是满的或空闲的。
  20. * 在enqueue()和dequeue()方法中,使用了try-finally块来确保锁始终被释放。这样,即使发生异常,也能够保证锁被释放,从而避免死锁。
  21. */
  22. public class ThreadSafeQueue<T> {
  23. private Queue<T> queue = new LinkedList<>();
  24. private final Lock lock = new ReentrantLock();
  25. private final Condition notEmpty = lock.newCondition();
  26. private final Condition notFull = lock.newCondition();
  27. private int maxSize;
  28. public ThreadSafeQueue(int maxSize) {
  29. this.maxSize = maxSize;
  30. }
  31. public void enqueue(T item) throws InterruptedException {
  32. lock.lock();
  33. try {
  34. while (queue.size() == maxSize) {
  35. notFull.await();
  36. }
  37. UploadParamsVO up =(UploadParamsVO)item;
  38. System.out.println("进入队列"+up.getFirstAddress());
  39. queue.add(item);
  40. TimeUnit.MILLISECONDS.sleep(1000);
  41. notEmpty.signalAll();
  42. } finally {
  43. lock.unlock();
  44. }
  45. }
  46. public T dequeue() throws InterruptedException {
  47. lock.lock();
  48. try {
  49. while (queue.isEmpty()) {
  50. notEmpty.await();
  51. }
  52. UploadParamsVO up =(UploadParamsVO)queue.element();
  53. System.out.println("出队列"+up.getFirstAddress());
  54. T item = queue.remove();
  55. TimeUnit.MILLISECONDS.sleep(2000);
  56. notFull.signalAll();
  57. return item;
  58. } finally {
  59. lock.unlock();
  60. }
  61. }
  62. }