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

当其他方法在Java中完成时,如何暂停控制台intpu,java,multithreading,concurrency,wait,Java,Multithreading,Concurrency,Wait,我在Java中有以下任务: 用户正在向控制台写入消息。我正在阅读此输入并将其处理为相关对象(书籍)。当已处理的书籍数量等于30时,我必须暂停控制台输入,记录到目前为止已处理书籍的报告,然后继续从控制台接收消息。(由于它是一个控制台应用程序,因此假设它是一个单线程应用程序) 我是并发编程的新手,但从我所读到的内容来看,我需要使用wait()和notify()方法 到目前为止,我的应用程序结构如下: protected static synchronized void reader(Book boo

我在Java中有以下任务: 用户正在向控制台写入消息。我正在阅读此输入并将其处理为相关对象(书籍)。当已处理的书籍数量等于30时,我必须暂停控制台输入,记录到目前为止已处理书籍的报告,然后继续从控制台接收消息。(由于它是一个控制台应用程序,因此假设它是一个单线程应用程序)

我是并发编程的新手,但从我所读到的内容来看,我需要使用
wait()
notify()
方法

到目前为止,我的应用程序结构如下:

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();
        }
    }
InputReader.java
-从控制台读取输入并转换为相关对象的主类
BookReader.java
-类,其中最重要的方法是处理一本书(同时统计到目前为止处理的书的数量)。我们把它叫做公共静态存储(BookBook)。 因此,在
InputReader.java
中,在读取单个控制台行之后,我将其处理为
Book
对象,然后调用
BookReader.keep(Book)
(因为
store
方法在
BookReader.java
calss中是静态的)。 问题是(或者说是我遇到的问题)在读了第30本书之后,如何暂停控制台,然后打印输出。 从我所读到的内容来看,我应该在我的
store(Book Book)
方法中使用
wait()
,并在执行报告的方法中使用
notify()
。 因为
store(Book Book)
是一种
static
方法,所以我读到应该使用
private static final Object lock=new Object()在我的
书店.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();
        }
    }
请记住,因为我的
商店(图书)
是静态的,所以我使用的是
静态对象锁=新对象()
作为
BookReader.java
类的对象。
我的主要问题是:我是否在正确的位置调用
report()
方法?如果没有,那么在哪里

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

以下程序从控制台读取30行代码,编写报告并重复执行

import java.util.Scanner;

public class ScannerTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            String report = "";
            for (int i = 0; i < 30; i++) {
                report += sc.nextLine()+" ";
            }
            System.out.println(report);
        }
    }
}
import java.util.Scanner;
公共级扫描测试{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
while(true){
字符串报告=”;
对于(int i=0;i<30;i++){
报表+=sc.nextLine()+“”;
}
系统输出打印(报告);
}
}
}

应用程序必须是多线程的吗?这是为了某种锻炼吗?这似乎把问题复杂化了很多。您声明它是一个单线程应用程序,然后继续使用多线程概念。为什么方法是静态相关的?请陈述你需要帮助的实际问题,而不是描述你的整个思想城堡。@Thomas不,不是。有人明确地说它是一个单线程应用程序。但是我认为我应该在输出报告时“暂停”控制台输入?如果这是一个单线程应用程序,那么该单线程在生成和打印输出时无法读取任何输入,因此不需要在线程之间进行任何协调(只有一个)。