java - 发生 FileNotException 时如何停止生产者线程和消费者线程

标签 java multithreading

我正在从某个位置读取 csv 文件。

您能否告诉我,如果在这种情况下找不到文件,如何停止生产者线程和消费者线程?

下面是我的程序,它创建两个线程,生产者线程和消费者线程来从文件读取数据

package com.util;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
import au.com.bytecode.opencsv.CSVReader;

public class TestProgram {
    public static void main(String args[]) {
        final String startToken = ",Nifty 50 Gainers";
        final String endToken = "50 Losers";
        final PipedWriter pipedWriter = new PipedWriter();
        PipedReader pipedReaderTmp = null;
        try {
            pipedReaderTmp = new PipedReader(pipedWriter);
        } catch (IOException e) {
        }
        final PipedReader pipedReader = pipedReaderTmp;
        // Consumer
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    CSVReader csvReader = new CSVReader(pipedReader);
                    while (true) {
                        String[] line = csvReader.readNext(); // blocks until the next line is available
                        if (line == null)
                            break; // end of stream has been reached
                        if (line != null && line.length > 3) {
                            String indices_name = line[1];
                            if (indices_name != null) {

                                System.out.println(indices_name);
                            }

                        }
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        }).start();

        // Producer
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    BufferedReader br = new BufferedReader(new FileReader(
                            "C:\\Users\\ravikiranv\\Downloads\\MA050116.csv"));
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        if (startToken.equals(line))
                            break;
                    }
                    while ((line = br.readLine()) != null) {
                        if (line.contains((endToken))) {
                            break;
                        } else {
                            pipedWriter.write(line + '\n');
                        }
                    }
                    pipedWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

最佳答案

请参阅 PipedReader.read()Javadoc .

Throws: IOException - if the pipe is broken, unconnected, closed, or an I/O error occurs.

所以只要关闭它,另一端就会得到一个IOException

注意:PipedReader 有一些 issues - 您可能会发现使用“BlockingQueue”之类的东西更安全/更好。

关于java - 发生 FileNotException 时如何停止生产者线程和消费者线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34880737/

相关文章:

java - JSP Servlet多线程问题

c - C 中的多线程 : passing a structure

Java多线程在长进程、最大CPU占用率下变慢

java - Java 中的 File.length() 返回错误的长度

java - 返回最大尺寸的列表<integer>对象

multithreading - 退出 Haskell 程序的最佳方法是什么?

javascript - 如何在 JavaScript 中创建后台线程

java - 获取 Java 运行时参数 --argumentName=argumentValue

java - 如何创建一个文件并在其上写入 URL

java - Windows 上的 Tomcat - 免费的分析和指标收集工具?