我正在编写程序,它正在生成具有给定字母的字符排列。我想用线程。线程数等于字母表中的字符数。这是代码:
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);
}
}
我认为我做错了,因为当我测量顺序生成的时间时,它更快,更快。并发生成的时间是两倍。在我看来,加入线程有问题,但我不确定。如果我们不知道哪个线程将首先完成,是否有任何好的解决方案来完成多个线程?
答案 0 :(得分:2)
你的逻辑有问题......
只执行了Synchronized语句78125次,但是在“else”部分中还有很多其他代码和循环。
5个字母,目标长度为7,使得5 ^ 7 = 78125个组合。
因此,假设您的目标是在pass_tmp值中生成每个可能的组合 - 您正在顺序工作,因为该部分永远不会由两个线程同时执行。 (加上托管线程的所有额外开销)
答案 1 :(得分:1)
几乎所有执行都处于同步(this)之下,因此顺序运行。加上同步语句的执行可能需要很长时间。最后,synchronized语句执行了很多次。