Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在发生FileNoteException时停止生产者线程和消费者线程_Java_Multithreading - Fatal编程技术网

Java 如何在发生FileNoteException时停止生产者线程和消费者线程

Java 如何在发生FileNoteException时停止生产者线程和消费者线程,java,multithreading,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; i

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

只有在知道文件存在的情况下,才能实例化和启动线程。这可以使您免于担心从内部停止线程

File file = new File("C:\\Users\\ravikiranv\\Downloads\\MA050116.csv");

if (file.exists()) {
     new Thread(new Runnable() { ... }).start();
     ...
}

如果您出于某种原因不想这样做,您可以保留对消费者线程的引用,并从生产者内部阻止它。有关如何执行此操作的示例,请参见有关详细信息,请参见
Javadoc

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

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

注意:
PipedReader
有一些功能-您可能会发现使用类似“BlockingQueue”的功能更安全/更好