在java中创建Multi Thread的正确方法?

时间:2011-11-22 07:11:39

标签: java multithreading

我有一个实现Runnable接口的类。我想为该类创建多个线程,我发现了两种创建多线程的方法:

  class MyRunnable implements Runnable {
        public void run() {
          System.out.println("Important job running in MyRunnable");
     }
   }

1.第一种方法:

    public class TestThreads {
    public static void main (String [] args) {
    MyRunnable r = new MyRunnable();
    Thread foo = new Thread(r);
    Thread bar = new Thread(r);
    Thread bat = new Thread(r);
    foo.start();
    bar.start();
    bat.start();
    }
    }

2.第二种方法:

public class TestThreads 
{
public static void main (String [] args) 
{
Thread[] worker=new Thread[3];
MyRunnable[] r = new MyRunnable[3];

for(int i=0;i<3;i++)
{
   r[i] = new MyRunnable();
   worker[i]=new Thread(r[i]);
   worker[i].start();

}
}
}

哪一个是最佳使用方法,两者之间有什么区别?

此致

4 个答案:

答案 0 :(得分:2)

我建议您使用ExecutorService。 sample

答案 1 :(得分:2)

在您的示例中,runnable没有实例状态,因此您不需要多个实例。

否则我更喜欢第二种方法,因为每次你连续多次剪切和粘贴一行代码时,循环通常是更好的主意。

通常,你应该等待你开始的一个主题。

public class TestThreads {
    public static void main (String [] args) {
        Thread[] worker=new Thread[3];
        Runnable r = new MyRunnable();

        for(int i=0;i<3;i++) {
           worker[i]=new Thread(r);
           worker[i].start();
        }

         for(int i=0;i<3;i++) {
           worker[i].join();
           worker[i] = null;
        }
    }

}

然后下一步将使用Java 5+的ExecutorService。您不希望并且需要在现代Java中管理自己的线程。

int poolSize = 3;
int jobCount = 3;
Runnable r = new MyRunnable()
ExecutorService  pool = Executors.newFixedThreadPool(poolSize);
for (int i = 0; i < jobCount; i++) {
    pool.execute(r);
}
pool.shutdown();

答案 2 :(得分:0)

唯一区别是第一个只有一个“MyRunnable”副本运行3次。第二种方法每个线程都有自己的MyRunnable副本。在这种情况下不是问题

答案 3 :(得分:0)

两种方法中的每一种都有其用途:

  1. 如果你有几个不同的任务要并行执行,不使用相同的Runnable接口(即下载一个网页,同时处理一些XML),第一种方法很有用。当然,这在您的示例中不可见,因为您使用的是相同的界面。
  2. 第二种方法是当你想用多个线程处理相同的东西时(也就是主从模式,其中主线程产生一组线程来处理相同的事物,然后将它们连接到一个屏障)。 / LI>