Java 多线程读取文件并执行runnable 什么

Java 多线程读取文件并执行runnable 什么,java,multithreading,blockingqueue,Java,Multithreading,Blockingqueue,我正在尝试构建一个工具,在完成一些字符串转换之后,它将读取文本文件并发布文本 怎样 该工具逐行读取文件并填充LinkedBlockingQueue。同时,我启动多个线程,然后每个线程从LBQ获取一条消息,进行一些处理并发布它们 主要 多线程发布服务器 问题 调用initMessagePublish First的目的是,发布者不必等待从文件中读取所有行,然后再开始发布。只要LBQ中有可用的内容,它就应该开始发布 但在当前的实现中,控件永远不会出现在initMessagePublish和start

我正在尝试构建一个工具,在完成一些字符串转换之后,它将读取文本文件并发布文本

怎样 该工具逐行读取文件并填充LinkedBlockingQueue。同时,我启动多个线程,然后每个线程从LBQ获取一条消息,进行一些处理并发布它们

主要

多线程发布服务器

问题 调用initMessagePublish First的目的是,发布者不必等待从文件中读取所有行,然后再开始发布。只要LBQ中有可用的内容,它就应该开始发布


但在当前的实现中,控件永远不会出现在initMessagePublish和start searchUsingScanner中。我如何解决这个问题?基本上,这两个方法应该并行执行。

只需在主类中的新线程行5中启动messagePublisher:

new Thread(()->tool.initMessagePublish()).start();

它应该可以解决您的问题。

您需要启动至少一个方法tool.initMessagePublish;以及使用扫描仪进行工具搜索;在一个新的线程中,我们做了类似的事情。在实际发布机制启动之前,为searchUsingScanner创建了一个runnable,并在initMessagePublish主体内调用了它。但这也很有效,而且是一个快速解决方案!
private void searchUsingScanner() {
        Scanner scanner = null;
        try {
            scanner = new Scanner(new File(LOG_FILE_PATH));
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine().trim();
                if (StringUtils.isNotBlank(line)) {
                    lbQueue.offer(line);
                }
            }
        } catch (Exception e) {
            logger.error("Error while processing file: " + e.toString());
        } finally {
            try {
                if (scanner != null) {
                    scanner.close();
                }
                // end thread execution
                keepPublisherActive = false;
            } catch (Exception e) {
                logger.error("Exception while closing file scanner " + e.toString());
                throw e;
            }
        }
    }
    private void initMessagePublish() throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(6);
    try {
        while (keepPublisherActive || lbQueue.getSize() > 0) {
            service.execute(messagePublisher); // messagePublisher implements Runnable
        }
    } catch (Exception ex) {
        logger.error("Multi threaded message publish failed " + ex.toString());
        throw ex;
    } finally {
        service.shutdown();
    }
}
new Thread(()->tool.initMessagePublish()).start();