gpt4 book ai didi

java - 线程的正确使用方法

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

我正在编写程序,该程序正在生成具有给定字母表的字符的排列。我想使用线程。线程数等于字母表中的字符数。代码如下:

public class Test
{
int i=0;
char[] pass_tmp = new char[100];
void haslogen(int n, int L, int level, char[] alphabet, char[] password)
{
if (level == n)
{
synchronized(this)
{
password[level]=0;
pass_tmp = password;
i++;
}
}
else {
for (int i=0;i<L;i++) {
password[level]=alphabet[i];
haslogen(n,L,level+1,alphabet,password);
}
}
}

void crack_passwd(char[] alphabet, int dl_slowa)
{
int L = alphabet.length;
Thread[] threads = new Thread[alphabet.length];
for( int j=0 ; j<alphabet.length ; j++ )
{
final int litera = j;
threads[j] = new Thread(new Runnable()
{
public void run()
{
char[] password = new char[100];
password[0]=alphabet[litera];
haslogen(dl_slowa,L,1,alphabet,password);
}

});
threads[j].start();
}
for( int j=0 ; j<alphabet.length ; j++ )
try {
threads[j].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] argv)
{
Test a = new Test();
char[] alphabet = {'a','b','c','d','e'};
long start, end;
start=System.nanoTime();
a.crack_passwd(alphabet,7);
end=System.nanoTime();

System.out.println(end-start+" "+a.i);
}
}

我认为我做错了什么,因为当我测量顺序生成的时间时,它更快,真的更快。并发生成的时间是原来的两倍。在我看来,连接线程有问题,但我不确定。如果我们不知道哪个线程先完成,有什么好的解决方案来完成多个线程吗?

最佳答案

你的逻辑有问题...

仅 Synchronized 语句执行了 78125 次,但“else”部分中有大量其他代码和循环。

5 个字母,目标长度为 7,可产生 5^7 = 78125 个组合。

因此,假设您的目标是生成 pass_tmp 值中的每种可能的组合 - 您完全是按顺序工作的,因为该部分永远不会由两个线程同时执行。 (加上托管线程的所有额外开销)

关于java - 线程的正确使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405041/

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