Java 如何在发生FileNoteException时停止生产者线程和消费者线程
我正在从某个位置读取csv文件 如果在这种情况下找不到文件,请告诉我如何停止生产者线程和消费者线程 下面是我的程序,它创建了两个线程,生产者线程和消费者线程来读取文件中的数据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
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”的功能更安全/更好