在java中创建多线程的正确方法?
我有一个实现可运行接口的类。我想为该类创建多个线程,我发现了两种创建多线程的方法:在java中创建多线程的正确方法?,java,multithreading,Java,Multithreading,我有一个实现可运行接口的类。我想为该类创建多个线程,我发现了两种创建多线程的方法: class MyRunnable implements Runnable { public void run() { System.out.println("Important job running in MyRunnable"); } } 1.1第一种方法: public class TestThreads { public stati
class MyRunnable implements Runnable {
public void run() {
System.out.println("Important job running in MyRunnable");
}
}
1.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();
}
}
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();
}
}
}
2.2第二种方法:
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();
}
}
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();
}
}
}
哪一种是最好的使用方法,两者之间的区别是什么
关于我建议您使用Executor服务 我建议您使用Executor服务 在您的示例中,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;
}
}
}
接下来的步骤是使用Java5+的。您不希望也不需要在现代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();
在您的示例中,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;
}
}
}
接下来的步骤是使用Java5+的。您不希望也不需要在现代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();
唯一的区别是第一个MyRunnable只有一个副本运行了3次。第二种方法每个线程都有自己的MyRunnable副本。在这种情况下没有问题,因为唯一的区别是第一个,只有一个MyRunnable副本运行了3次。第二种方法每个线程都有自己的MyRunnable副本。在这种情况下不是问题,因为这两种方法都有各自的用途: 如果您有几个不同的任务要并行执行,而这些任务不使用相同的可运行接口,即下载一个网页,同时处理一些XML,那么第一种方法非常有用。当然,这在您的示例中不可见,因为您使用的是相同的接口。 第二种方法是,当您希望使用多个线程(也称为主-从模式)处理同一件事时,主线程生成一组线程来处理同一件事,然后在屏障处加入它们。
这两种方法各有其用途: 如果您有几个不同的任务要并行执行,而这些任务不使用相同的可运行接口,即下载一个网页,同时处理一些XML,那么第一种方法非常有用。当然,这在您的示例中不可见,因为您使用的是相同的接口。 第二种方法是,当您希望使用多个线程(也称为主-从模式)处理同一件事时,主线程生成一组线程来处理同一件事,然后在屏障处加入它们。
如果Runnable没有状态变量,则不需要三个Runnable实例。除此之外,请使用ExecutorService,不要创建自己的线程。如果Runnable没有状态变量,则不需要三个Runnable实例。除此之外,请使用ExecutorService,不要创建自己的线程。我没有太多的多线程编程经验。到目前为止,如果我必须运行多个线程,我使用了第二种方法,但没有使用ExecutorService。我不太明白使用它的利/弊。请你解释一下好吗?@Albertoslano ExecutorService让你可以重用一个线程池,而不是为每个runnable创建新线程。我没有太多的多线程编程经验。到目前为止,如果我必须运行多个线程,我使用了第二种方法,但没有使用ExecutorService。我不太明白使用它的利/弊。请您解释一下好吗?@AlbertoSolano ExecutorService允许您重用线程池,而不是为每个可运行线程创建新线程。