为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 中完成其他方法时暂停控制台 intpu

如何在 Java 中完成其他方法时暂停控制台 intpu

蛊毒传说 2021-08-06 10:19:34
我在 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()在正确的位置调用该方法?如果没有,那么在哪里?
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

我的想法是进行“变通”并将“报告时间”期间的所有传输保存在队列等集合中,然后在您报告状态时阅读队列中的书籍。Mabye 那是您问题的另一种解决方案。


查看完整回答
反对 回复 2021-08-06
  • 2 回答
  • 0 关注
  • 355 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信