我在 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()在正确的位置调用该方法?如果没有,那么在哪里?
米脂
相关分类