java - 多线程从文件读取并执行runnable

标签 java multithreading blockingqueue

什么?

<小时/>

我正在尝试构建一个工具,该工具将读取文本文件并在进行一些字符串转换后发布文本。

怎么做?

<小时/>

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

主要

private static LinkedBlockingQueue<String> lbQueue = new LinkedBlockingQueue<>();
private static Boolean keepPublisherActive = Boolean.TRUE;
public static void main(String[] args) {
    try {
        tool.initMessagePublish();
        tool.searchUsingScanner();
    } catch (Exception ex) {
        logger.error("Exception in Tool Main() " + ex.toString());
        throw ex;
    }
}

文件阅读器

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();
    }
}

问题

<小时/>

首先调用 initMessagePublish() 的目的是发布者在开始发布之前不需要等待从文件中读取所有行。一旦 LBQ 中出现可用内容,它就应该开始发布。

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

最佳答案

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

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

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

关于java - 多线程从文件读取并执行runnable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51331080/

相关文章:

安卓 "Only the original thread that created a view hierarchy can touch its views."

java - RejectedExecutionException 后调用线程不会停止

c++ - 为 std::future 删除

Java ScheduledExecutorService 生产者\消费者

java - 隐藏文字的EditText宽度

Java Mailgun API 调用收到错误 400 错误请求

Java Paint(是的,我知道,但我搜索过..),ActionListeners

java - TestNG - 如何断言两个列表相等而忽略顺序?

Java异步方法调用/后台处理

java - 在 Android 中使用阻塞队列创建缓冲区类