Java建立一个多线程程序,分别用两个线程读取x1,x2两个文件数据内容,数字部分乘以2倍,间隔两秒中往X3文件中复制写入一次数据
时间: 2024-09-13 14:10:32 浏览: 55
在Java中创建一个多线程程序,你可以使用`Thread`类或更现代的`java.util.concurrent`包下的`ExecutorService`和`Callable`。这里是一个简单的例子,我们将使用`Thread`类:
首先,你需要准备三个文件读写操作,每个线程负责读取一个文件并将数字部分乘以2。假设你已经有一个方法`readAndMultiply(String filePath)`来处理文件内容并返回数值。
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MultiThreadedCopy {
private static final String FILE_X1 = "x1.txt";
private static final String FILE_X2 = "x2.txt";
private static final String FILE_X3 = "x3.txt";
public void copyFiles() throws IOException {
Thread reader1 = new Thread(() -> {
try (BufferedReader br1 = new BufferedReader(new FileReader(FILE_X1))) {
String line1;
while ((line1 = br1.readLine()) != null) {
double number1 = Double.parseDouble(line1);
double doubledNumber1 = number1 * 2;
writeToFile(doubledNumber1, FILE_X3);
// 每隔两秒写入一次
try (BufferedReader ignored = new BufferedReader(new FileReader(FILE_X1));) { // 虚拟读取防止阻塞
Thread.sleep(2000);
}
}
}
});
Thread reader2 = new Thread(() -> {
try (BufferedReader br2 = new BufferedReader(new FileReader(FILE_X2))) {
String line2;
while ((line2 = br2.readLine()) != null) {
double number2 = Double.parseDouble(line2);
double doubledNumber2 = number2 * 2;
writeToFile(doubledNumber2, FILE_X3);
// 每隔两秒写入一次
try (BufferedReader ignored = new BufferedReader(new FileReader(FILE_X2));) { // 虚拟读取防止阻塞
Thread.sleep(2000);
}
}
}
});
reader1.start();
reader2.start();
// 等待所有线程结束
reader1.join();
reader2.join();
}
private void writeToFile(double value, String fileName) throws IOException {
try (FileWriter writer = new FileWriter(fileName)) {
writer.write(value + "\n");
}
}
public static void main(String[] args) {
try {
new MultiThreadedCopy().copyFiles();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
在这个示例中,我们有两个线程(reader1 和 reader2),它们各自读取 `FILE_X1` 和 `FILE_X2` 文件,然后将数字乘以2,并每两秒将结果写入到 `FILE_X3` 中。
请注意,在实际生产环境中,你可能需要考虑异常处理、资源关闭以及线程安全问题(例如同步文件操作)。另外,上述代码中的 `Thread.sleep(2000);` 使用了 `sleep()` 方法,这是一个阻塞操作,如果你想要避免线程因为等待而阻塞其他操作,可以使用非阻塞的方式比如定时器或者事件驱动。
阅读全文