java 多线程哈希 ArrayList<String>

标签 java multithreading arraylist

我想对数组列表中的每个项目进行哈希处理,然后基本上将其返回到主函数上。但例如有这样的:

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() 对象,其中消息变量随机更改,而不知道是否有任何线程已经完成工作。

例如,可能会发生以下情况:

  1. 您为第一条消息启动线程
  2. 线程尚未运行,但您的 for 循环已将消息设置为第二个
  3. 线程运行并计算第二条消息的消息
  4. 消息 3 已设置。由于线程已经完成,所以什么也没有发生。
  5. 消息 4 再次设置,线程完成后没有任何反应 等等

修复它:

  • 从哈希中删除列表变量。
  • 为每个哈希码/消息创建一个新的 hash() 对象
  • 为每个 hash() 对象启动一个新线程。那么它应该可以工作。

关于java 多线程哈希 ArrayList<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31653348/

相关文章:

java - 如何匹配 ArrayList<String> 中的精确字符串

Java 解压缩带有文件夹 FileNotFoundexception 的压缩存档

java - 如何等待Java中线程的启动

java - Callable 如何防止 call() 返回值

C++ std::async 调用类成员方法看不到变量变化

Java比较两个字符串列表中的特定字符并将其删除

java - 如何在java中创建这些方法?

java - Derby EmbeddedDriver 在没有 Class.forName 的情况下工作

java - Red5 RTMPT 不工作

java - 如何在谓词中对 FilteredList 结果进行优先级排序/排序?