使用多个线程将数据写入文本文件(同时,在文件的不同行中)
Write data into text file with multiple threads (simultaneously, in different lines of file)
创建 k 个同时将字符写入同一文件的线程:
- 第一个线程在文件的第一行恰好写入数字 0 20 次;
- 第二个线程在文件的第二行恰好写入数字 1 20 次;
...
- 第十个线程在文件的第十行恰好写入数字 9 20 次;
实施要求。
要求设置每写一位1毫秒的停顿
使用 RandomAccessFile 将数据写入文件。
您最多只能使用一个 RandomAccessFile 对象 class!
我写了这样的东西:
import java.io.IOException;
import java.io.RandomAccessFile;
public class Part5 {
// creates string before writing to the file
public static String createString(int integer){
StringBuilder result = new StringBuilder("");
for(int i = 0; i < 20; i++){
result.append(integer);
}
result.append("\n");
return result.toString();
}
// writes string into the file
public static void writeString(String st) {
try(RandomAccessFile file = new RandomAccessFile("part5.txt", "rw")){
st+="\n";
file.write(st.getBytes());
}catch(IOException ex){
ex.getMessage();
}
}
// starts writing threads
public static void startThread(int number){
Thread thread = new Thread(){
@Override
public void run() {
synchronized (this){
writeString(createString(number));
}
}
};
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(final String[] args) {
for(int i = 0; i < 9; i++){
startThread(i);
}
}
}
我的实现只重写文件的第一行,但应该这样写:
00000000000000000000
11111111111111111111
22222222222222222222
33333333333333333333
44444444444444444444
55555555555555555555
66666666666666666666
77777777777777777777
88888888888888888888
99999999999999999999
如何修复代码的“并发部分”以使其正常工作?
提前致谢!
写入文件时,需要将指针移动到正确的位置。您需要在 RandomAccessFile 中调用“seek”方法,然后将指针移动字节数。例如,第一个线程将查找 0,第二个线程将查找 21,依此类推。
您的程序现在的方式,每个线程都会覆盖其他所有线程。
并行化也可能有问题。
我不想给出现成的解决方案,但我很好奇。所以这里有一些你可以学习的东西
import java.io.IOException;
import java.io.RandomAccessFile;
public class Blah {
// creates string before writing to the file
public static String createString(int integer){
StringBuilder result = new StringBuilder("");
for(int i = 0; i < 20; i++){
result.append(integer);
}
result.append("\n");
return result.toString();
}
public static void main(final String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("part5.txt", "rw");
Blah blah = new Blah();
for(int i = 0; i <= 9; i++){
Thread thread = new Thread(blah.new NumberWriter(i, file));
thread.start();
}
file.close();
}
private class NumberWriter implements Runnable {
int number;
RandomAccessFile file;
public NumberWriter(int number, RandomAccessFile file) {
this.number = number;
this.file = file;
}
public void run() {
try {
int seek = this.number * 20 + number;
System.out.println("number is : " + number + " : seeking to : " + seek);
file.seek(seek);
file.write((createString(this.number)).getBytes());
} catch (IOException ioex) {
ioex.printStackTrace();
}
}
}
}
创建 k 个同时将字符写入同一文件的线程:
- 第一个线程在文件的第一行恰好写入数字 0 20 次;
- 第二个线程在文件的第二行恰好写入数字 1 20 次;
...
- 第十个线程在文件的第十行恰好写入数字 9 20 次;
实施要求。
要求设置每写一位1毫秒的停顿
使用 RandomAccessFile 将数据写入文件。
您最多只能使用一个 RandomAccessFile 对象 class!
我写了这样的东西:
import java.io.IOException;
import java.io.RandomAccessFile;
public class Part5 {
// creates string before writing to the file
public static String createString(int integer){
StringBuilder result = new StringBuilder("");
for(int i = 0; i < 20; i++){
result.append(integer);
}
result.append("\n");
return result.toString();
}
// writes string into the file
public static void writeString(String st) {
try(RandomAccessFile file = new RandomAccessFile("part5.txt", "rw")){
st+="\n";
file.write(st.getBytes());
}catch(IOException ex){
ex.getMessage();
}
}
// starts writing threads
public static void startThread(int number){
Thread thread = new Thread(){
@Override
public void run() {
synchronized (this){
writeString(createString(number));
}
}
};
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(final String[] args) {
for(int i = 0; i < 9; i++){
startThread(i);
}
}
}
我的实现只重写文件的第一行,但应该这样写:
00000000000000000000
11111111111111111111
22222222222222222222
33333333333333333333
44444444444444444444
55555555555555555555
66666666666666666666
77777777777777777777
88888888888888888888
99999999999999999999
如何修复代码的“并发部分”以使其正常工作? 提前致谢!
写入文件时,需要将指针移动到正确的位置。您需要在 RandomAccessFile 中调用“seek”方法,然后将指针移动字节数。例如,第一个线程将查找 0,第二个线程将查找 21,依此类推。
您的程序现在的方式,每个线程都会覆盖其他所有线程。
并行化也可能有问题。
我不想给出现成的解决方案,但我很好奇。所以这里有一些你可以学习的东西
import java.io.IOException;
import java.io.RandomAccessFile;
public class Blah {
// creates string before writing to the file
public static String createString(int integer){
StringBuilder result = new StringBuilder("");
for(int i = 0; i < 20; i++){
result.append(integer);
}
result.append("\n");
return result.toString();
}
public static void main(final String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("part5.txt", "rw");
Blah blah = new Blah();
for(int i = 0; i <= 9; i++){
Thread thread = new Thread(blah.new NumberWriter(i, file));
thread.start();
}
file.close();
}
private class NumberWriter implements Runnable {
int number;
RandomAccessFile file;
public NumberWriter(int number, RandomAccessFile file) {
this.number = number;
this.file = file;
}
public void run() {
try {
int seek = this.number * 20 + number;
System.out.println("number is : " + number + " : seeking to : " + seek);
file.seek(seek);
file.write((createString(this.number)).getBytes());
} catch (IOException ioex) {
ioex.printStackTrace();
}
}
}
}