gpt4 book ai didi

java - 写入文件时意外的线程同步

转载 作者:行者123 更新时间:2023-11-29 04:30:14 24 4
gpt4 key购买 nike

如果我有一个数到 1000 的胎面并像这样打印出结果:

public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i=0;i<1000;i++){
System.out.println(i+" ");
}
}
}

main 中我做了类似的事情:

new Thread(new MyRunnable()).start();
new Thread(new MyRunnable()).start();

结果变得困惑,因为我没有同步。

但是,如果我的线程看起来像:

public class MyRunnable implements Runnable{
Writer w;
MyRunnable(Writer w){
this.w=w;
}

@Override
public void run() {
for (int i=0;i<1000;i++){
try{
w.write(String.valueOf(i));
w.write (" ") ;
}//&catch the exception
}
}
}

我在 main 中有这个:

  try (Writer writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("Thread.txt"), "utf-8"))) {
Thread t1 =new Thread(new MyRunnable(writer));
Thread t2 =new Thread(new MyRunnable(writer));
t1.start();
t2.start();
t1.join();
t2.join();
} //catch the exception,etc.

结果看起来很正常:线程以某种方式同步了。我想这是因为我将 writer 作为参数传递,但有人能更好地解释一下吗?而且,出于好奇,有什么解决办法吗?

编辑: 抱歉,看来我太匆忙了。我试图简化 MyThread 并删除了太多代码。但我刚刚意识到我描述的情况只有在我尝试在 run() 方法中打开和读取文件时才会发生。所以运行实际上看起来像这样:

public  void run() {
try {
Scanner scanner = new Scanner(f); //f is new File (filename)
while (scanner.hasNext())
{
String str = scanner.next();
if (str.equals("word")) //code counts "word" appearance
count++;
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
for (int i=0;i<1000;i++){
try{
w.write(String.valueOf(i));
w.write (" ") ;
}//&catch the exception
} //continue by writing the count

我想这意味着问题实际上出在读取文件上?

最佳答案

Writer(BufferedWriter 的扩展)的write(String) 方法是同步的。

关于java - 写入文件时意外的线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44047924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com