正确使用线程的方法

时间:2015-05-22 20:02:39

标签: java multithreading

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

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);
}
}

我认为我做错了,因为当我测量顺序生成的时间时,它更快,更快。并发生成的时间是两倍。在我看来,加入线程有问题,但我不确定。如果我们不知道哪个线程将首先完成,是否有任何好的解决方案来完成多个线程?

2 个答案:

答案 0 :(得分:2)

你的逻辑有问题......

只执行了Synchronized语句78125次,但是在“else”部分中还有很多其他代码和循环。

5个字母,目标长度为7,使得5 ^ 7 = 78125个组合。

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

答案 1 :(得分:1)

几乎所有执行都处于同步(this)之下,因此顺序运行。加上同步语句的执行可能需要很长时间。最后,synchronized语句执行了很多次。