我在 Java 中有以下任务:用户正在向控制台写入消息。我正在阅读此输入并将其处理为相关对象(书籍)。当处理的书籍数量等于 30 时,我必须暂停控制台输入,记录到目前为止已处理书籍的报告,然后继续从控制台接收消息。(由于是控制台应用,所以假设是单线程应用)我是并发编程的新手,但从我读过的内容来看,我需要使用wait()和notify()方法。到目前为止,我的应用程序结构如下:InputReader.java- 从控制台读取输入并转换为相关对象的主类 BookReader.java- 类,最重要的方法是处理一本书(同时记录到目前为止处理的书籍数量)。让我们称之为public static store(Book book)。因此,InputReader.java在读取单个控制台行后,我将其处理为一个Book对象,然后调用BookReader.keep(book)(因为calss 中的store方法BookReader.java是静态的)。问题(或我挣扎的部分)是如何在阅读第 30 本书后暂停控制台,然后打印输出。从我读过的内容来看,我应该wait()在我的store(Book book)方法notify()内部和将执行报告的方法内部使用。因为store(Book book)是static我读过的一种方法,我应该private static final Object lock = new Object();在我的BookStore.java班级?所以目前我的结构类似于以下内容:protected static synchronized void reader(Book book) throws InterruptedException { counter++; //some method which will keep my books into a local datastructure if(counter == 30) { LOGGER.info("The console should stop accept new input now"); synchronized(lock){ lock.wait(); } // my main question: do I need to call printReport() here? If not here, then where? report(); } }以及report()打印报告后的方法应该使控制台可用于读取新消息:private static synchronized void report() { synchronized(lock){ System.out.printline("print some report here") } // I guess after the report is printed, I should use notifyAll() and that will make the console again available for reading an input? lock.notifyAll(); } }请记住,由于 mystore(Book book)是静态的,因此我将其static Object lock = new Object();用作BookReader.java类的对象。我的主要问题是:我是否report()在正确的位置调用该方法?如果没有,那么在哪里?
添加回答
举报
0/150
提交
取消