ReentrantLock

  1. public class MyContainer2<T> {
  2. final private LinkedList<T> lists = new LinkedList<>();
  3. final private int MAX = 10; //最多10个元素
  4. private int count = 0;
  5. private Lock lock = new ReentrantLock();
  6. private Condition producer = lock.newCondition();
  7. private Condition consumer = lock.newCondition();
  8. public void put(T t) {
  9. try {
  10. lock.lock();
  11. while(lists.size() == MAX) { //想想为什么用while而不是用if?
  12. producer.await();
  13. }
  14. lists.add(t);
  15. ++count;
  16. consumer.signalAll(); //通知消费者线程进行消费
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. } finally {
  20. lock.unlock();
  21. }
  22. }
  23. public T get() {
  24. T t = null;
  25. try {
  26. lock.lock();
  27. while(lists.size() == 0) {
  28. consumer.await();
  29. }
  30. t = lists.removeFirst();
  31. count --;
  32. producer.signalAll(); //通知生产者进行生产
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. } finally {
  36. lock.unlock();
  37. }
  38. return t;
  39. }
  40. public static void main(String[] args) {
  41. MyContainer2<String> c = new MyContainer2<>();
  42. //启动消费者线程
  43. for(int i=0; i<10; i++) {
  44. new Thread(()->{
  45. for(int j=0; j<5; j++) System.out.println(c.get());
  46. }, "c" + i).start();
  47. }
  48. try {
  49. TimeUnit.SECONDS.sleep(2);
  50. } catch (InterruptedException e) {
  51. e.printStackTrace();
  52. }
  53. //启动生产者线程
  54. for(int i=0; i<2; i++) {
  55. new Thread(()->{
  56. for(int j=0; j<25; j++) c.put(Thread.currentThread().getName() + " " + j);
  57. }, "p" + i).start();
  58. }
  59. }
  60. }