我在 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
提交
取消