更新时间:2023-11-25 13:44:10
Consumer类的run方法中,while
的条件应该改为!s.isEmpty()
。
主线程未能执行结束的原因是子线程都没有结束造成的,因为BlockingQueue.take()
造成了阻塞,看一下文档中写的
take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据被加入
也就是说当BlockingQueue中的对象被消费完毕之后,再次调用其take方法,就会进入等待状态,而题主在程序中使用while(true)
作为循环条件,则所有的线程都会不断的调用队列的take
方法,而进入阻塞状态,无法退出线程,子线程无法退出,则join之后的主线程System.out.println("主线程执行完毕");
则永远在等待,无法执行,故主线程也无法退出。