Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中创建多线程的正确方法?_Java_Multithreading - Fatal编程技术网

在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允许您重用线程池,而不是为每个可运行线程创建新线程。