我想对数组列表中的每个项目进行哈希处理,然后基本上将其返回到主函数上。但例如有这样的:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
public class hash extends Thread {
private Thread t = null;
private MessageDigest md = null;
private StringBuffer sb = null;
private String message = null;
private ArrayList<String> list = null;
private int count = 0;
public hash(ArrayList<String> list) {
this.list = list;
}
public final void mdstart() {
for(String item:list){
this.message=item;
if(t==null){
t = new Thread(this);
t.start();
}
count++;
}
System.out.println("end: "+this.count);
}
@Override
public final void run() {
System.out.println("run: "+this.count);
try {
md = MessageDigest.getInstance("MD5");
md.update(this.message.getBytes());
byte[] digest = md.digest();
sb = new StringBuffer();
for (byte hash : digest) {
sb.append(String.format("%02x", hash));
}
System.out.println(this.message + " : " + sb.toString());
} catch (NoSuchAlgorithmException ex) {
System.out.println("no such algorithm exception : md5");
System.exit(1);
}
}
public static void main(String args[]) {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("message" + i);
}
new hash(list).mdstart();
}
}
输出为:
end: 10
run: 10
message9 : 99f72d2de922c1f14b0ba5e145f06544
这意味着该程序仅运行我期望的最后一个线程。
最佳答案
您将线程存储在 t
中,该线程在开始时为 null,但在创建第一个线程后,它不再为 null,因此您的 if 失败并且不会创建新线程。然后您尝试在该线程运行时修改消息...老实说,整个事情一团糟。即使您要创建 10 个线程,它们都会指向同一个 hash() 对象,其中消息变量随机更改,而不知道是否有任何线程已经完成工作。
例如,可能会发生以下情况:
- 您为第一条消息启动线程
- 线程尚未运行,但您的 for 循环已将消息设置为第二个
- 线程运行并计算第二条消息的消息
- 消息 3 已设置。由于线程已经完成,所以什么也没有发生。
- 消息 4 再次设置,线程完成后没有任何反应 等等
修复它:
- 从哈希中删除列表变量。
- 为每个哈希码/消息创建一个新的 hash() 对象
- 为每个 hash() 对象启动一个新线程。那么它应该可以工作。
关于java 多线程哈希 ArrayList<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31653348/