java中的线程排序

java中的线程排序,java,multithreading,Java,Multithreading,初步信息:我正在编写一个有两组线程的程序。第1组线程每个都有一个字符串,它们接收并计算SHA-256散列,然后将该散列粘贴到共享对象中。组2线程都有一个用户名和哈希密码。他们的工作是将散列密码与共享对象中的密码进行比较,以破解密码 问题:我目前有工作,但我试图找到一种方法,以确保第2组线程输出的用户在同一顺序的原始文件。一个问题是,如果在计算哈希值时发现匹配项,则该程序需要打印用户名和密码。我怎样才能在保留此要求的同时仍按原始文件的顺序打印出来?以下是我为2组线程编写的代码组2必须在组1之前创建

初步信息:我正在编写一个有两组线程的程序。第1组线程每个都有一个字符串,它们接收并计算SHA-256散列,然后将该散列粘贴到共享对象中。组2线程都有一个用户名和哈希密码。他们的工作是将散列密码与共享对象中的密码进行比较,以破解密码

问题:我目前有工作,但我试图找到一种方法,以确保第2组线程输出的用户在同一顺序的原始文件。一个问题是,如果在计算哈希值时发现匹配项,则该程序需要打印用户名和密码。我怎样才能在保留此要求的同时仍按原始文件的顺序打印出来?以下是我为2组线程编写的代码组2必须在组1之前创建

第1组线程:

第2组线程:


您可以让Group2Th等待Group1Th完成其工作并退出,以确保订购


看看这个方法。

Group2处理多线程没有多大意义。创建的锁争用刚好高于必需的锁争用。如果将group1列在线程池执行器中,然后在未来阻塞列表上迭代,直到它们完成为止,您将拥有正确的顺序并可以从该线程执行比较。这是否仍然允许程序在计算匹配后立即打印匹配的输出,或者我会等待其他文件完成吗?如果您想按原始文件的相同顺序打印它们,则不能按计算顺序打印它们,至少必须等到下一个必须打印的文件计算完毕。如果已经计算了下一个3,请在之后立即打印,但不要在之前打印。奇数。本计划的要求如下。每个第2组线程必须在计算字典密码哈希后立即与每个字典密码哈希匹配。如果某个第2组线程找到匹配项,该线程必须为该用户打印输出行。这是否意味着,如果需要,我可以只在第2组线程中进行匹配,而不打印它,除非前一个线程完成?如果是这样的话,最好的方法是什么?我不知道预期的解决方案是什么,以及您应该在多大程度上更改代码。例如,添加一个shared.printed布尔值,您的wait in group2会检查每个先前的项,当满足该条件并且它自己的散列被破解时,会打印输出并设置其标志。当有疑问时,询问创建需求的人它应该如何工作。
private static class Group1Th implements Runnable {
    private String passToHash;
    private SharedDict shared;
    private Lock lock;
    public Group1Th(String passToHash, Lock lock, SharedDict shared) {
        this.passToHash = passToHash;
        this.shared = shared;
        this.lock = lock;
    }

    public void run() {
        MessageDigest md = null;
        try {md = MessageDigest.getInstance ("SHA-256");}
        catch (NoSuchAlgorithmException e1) {e1.printStackTrace();}
        String password = this.passToHash;
        byte[] data = null;
        try {data = password.getBytes ("UTF-8");} 
        catch (UnsupportedEncodingException e) {e.printStackTrace();}

        for (int i = 1; i <= 100000; i++) {
            md.update(data);
            data = md.digest();
        }
        String hexData = Hex.toString(data);
        //System.out.println("Hash for (" + password + "): " + hexData);
        {synchronized(shared) {
            shared.hashed.add(hexData);
            shared.unhashed.add(password);
            shared.notifyAll();
        }}
    }
}
private static class Group2Th implements Runnable {
    private String dbUser;
    private String dbHashedPass;
    private SharedDict shared = new SharedDict();
    //lprivate int current = -1;

    public Group2Th(String dbUser, String dbHashedPass, SharedDict shared) {
        this.dbUser = dbUser;
        this.dbHashedPass = dbHashedPass;
        this.shared = shared;
        //this.current = -1;
    }

    public void run() {
        System.out.println("Hello from G2 Thread: " + this.dbUser + " ==> " + this.dbHashedPass);
        {synchronized(shared) {
            boolean broken = false;
            while (broken == false) {   
                try {
                    shared.wait();
                    for (int i=0; i < shared.hashed.size(); i++) {
                        if (shared.hashed.get(i).equals(dbHashedPass)) {
                            System.out.println(dbUser + " " + shared.unhashed.get(i));
                            broken = true;
                            break;
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }}
    }
}