【问题标题】:How to Stop Producer Thread and Consumer Thread in case FileNotException occurs发生 FileNotException 时如何停止生产者线程和消费者线程
【发布时间】:2016-01-19 15:32:17
【问题描述】:

我正在从某个位置读取 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();
    }
}

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    对于PipedReader.read(),请参阅Javadoc

    抛出: IOException - 如果管道损坏、未连接、关闭或发生 I/O 错误。

    所以只需close 它,另一端将获得IOException

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

    【讨论】:

      【解决方案2】:

      只有在您知道文件存在的情况下,您才能并且应该实例化和启动线程。这使您不必担心从内部停止线程。

      File file = new File("C:\\Users\\ravikiranv\\Downloads\\MA050116.csv");
      
      if (file.exists()) {
           new Thread(new Runnable() { ... }).start();
           ...
      }
      

      如果您出于某种原因不希望这样做,您可以保留对消费者线程的引用并从生产者中停止它。有关如何执行此操作的示例,请参阅this answer

      【讨论】:

        猜你喜欢
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2017-02-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多