我有一个实现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();
}
}
}
哪一个是最佳使用方法,两者之间有什么区别?
此致
答案 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)
两种方法中的每一种都有其用途: