gpt4 book ai didi

java - 同步线程无法正常工作

转载 作者:行者123 更新时间:2023-12-01 17:17:29 25 4
gpt4 key购买 nike

我试图理解线程,所以我做了一个简单的程序。我从文件中读取数字,将它们放入一个数组中,然后对于数组中的每个元素,我将其与自身相乘,然后,当遍历整个数组时,我将其写入文件中。我在这个程序中使用了 n 个线程。问题是,并不是每次我都能得到我期望的答案。例如:

数字:2 3 4 1 1 4输出:4 9 16 1 1 16 - 正确

有时我会得到相同的数字:输出:16 81 256 1 1 256 - 这显然不是我想要的。

这是源代码:

类 MyThread2 进行乘法:

package thr;

import java.util.ArrayList;

public class MyThread2 extends Thread{

private ArrayList<Integer> array;

public MyThread2(ArrayList<Integer> a){
array = a;
}

public void run(){
for(int i=0; i < array.size(); i++){
synchronized (this) {
array.set(i, array.get(i) * array.get(i));
}
}
}
};

类App - 这是应用程序

package thr;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class App {

public ArrayList<Integer> readFromFile(String str){
ArrayList<Integer> a = new ArrayList<Integer>();
try{
BufferedReader reader = new BufferedReader(new FileReader(str));
String message = null;
while((message = reader.readLine()) != null){
try{
int nr = Integer.parseInt(message);
a.add(nr);
}catch(NumberFormatException e){
System.out.println(e.getMessage());
}
}
reader.close();
}catch(IOException e){
System.out.println(e.getMessage());
}

return a;
}

public void writeToFile(ArrayList<Integer> a){
try{
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
for(int i=0; i < a.size(); i++){
writer.write(a.get(i).toString());
writer.newLine();
}
writer.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}


public ArrayList<Integer> runThreads(ArrayList<Integer> a, int nrThreads) {

ArrayList<MyThread2> thread = new ArrayList<MyThread2>();
int i;


for(i=0; i < nrThreads; i++){
thread.add(new MyThread2(a));
}


for (i = 0; i < thread.size(); i++) {
thread.get(i).start();
}

System.out.println("in fctie");
print(a);
System.out.println("in fctie");

return a;
}

public void print(ArrayList<Integer> array){
for(int i=0; i < array.size(); i++){
System.out.println(array.get(i));
}
}

public static void main(String[] args){
App app = new App();
ArrayList<Integer> array;

array = app.readFromFile("numbers.txt");
app.print(array);
app.runThreads(array, 5);
app.print(array);
app.writeToFile(array);
}

}

有人知道我做错了什么吗?

最佳答案

您的代码中有很多问题。

首先:你的main方法启动N个线程,然后打印并保存所有这些线程正在修改的列表的内容。您没有等待线程完成,因此主线程和所有 MyThread2 线程正在以不可预测的方式同时访问该列表。

第二:有0个同步。唯一进行同步的地方是

synchronized (this) {
array.set(i, array.get(i) * array.get(i));
}

因此每个线程都会自行同步。所有线程都使用单独的锁,因此可以同时访问线程不安全列表。这有点像你有一把有 10 个门和 10 把 key 的保险箱锁:在这样的设计中,10 个人可以同时打开锁。你需要的是一扇门和一把 key 。

关于java - 同步线程无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20983122/

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