在多线程环境下,要安全地使用 InputStream,需要确保每个线程都有自己的 InputStream 实例,或者使用同步机制来确保在同一时间只有一个线程访问 InputStream。以下是一些建议:
- 为每个线程创建单独的 InputStream 实例:
public class MyRunnable implements Runnable { private String filePath; public MyRunnable(String filePath) { this.filePath = filePath; } @Override public void run() { try (InputStream inputStream = new FileInputStream(filePath)) { // 在这里处理输入流 } catch (IOException e) { e.printStackTrace(); } } }
然后在主线程中为每个子线程创建一个新的 InputStream 实例:
public static void main(String[] args) { Thread thread1 = new Thread(new MyRunnable("file1.txt")); Thread thread2 = new Thread(new MyRunnable("file2.txt")); thread1.start(); thread2.start(); }
- 使用同步机制(如 synchronized 关键字)来确保在同一时间只有一个线程访问 InputStream:
public class SharedInputStream { private final InputStream inputStream; public SharedInputStream(String filePath) throws FileNotFoundException { this.inputStream = new FileInputStream(filePath); } public synchronized int read() throws IOException { return inputStream.read(); } public synchronized int read(byte[] b) throws IOException { return inputStream.read(b); } public synchronized int read(byte[] b, int off, int len) throws IOException { return inputStream.read(b, off, len); } public synchronized void close() throws IOException { inputStream.close(); } }
然后在主线程中创建一个 SharedInputStream 实例,并将其传递给子线程:
public static void main(String[] args) { try { SharedInputStream sharedInputStream = new SharedInputStream("sharedFile.txt"); Thread thread1 = new Thread(new MyRunnable(sharedInputStream)); Thread thread2 = new Thread(new MyRunnable(sharedInputStream)); thread1.start(); thread2.start(); } catch (FileNotFoundException e) { e.printStackTrace(); } }
请注意,使用同步机制可能会导致性能下降,因为线程需要等待其他线程释放锁。在这种情况下,考虑使用其他并发工具,如 java.util.concurrent
包中的类。