同时运行多个线程

15

大家好,针对同时运行多个线程,是从一个类创建不同的线程对象,还是创建两个类,其中一个实现可运行接口,另一个继承线程并根据需要从两个类中创建线程对象,哪种方法更可取,假设我们尝试同时运行7-10个任务。

  1. 哪种方法是最佳解决方案?
  2. 如果从单个类创建不同的线程对象,是否会出现任何问题或性能降低?

谢谢。一如既往地感谢建议。


线程和进程是两个不同的概念。如果你指的是线程,请使用术语“线程”,而不是“进程”。 - JB Nizet
你真的是指操作系统进程吗?在编程上下文中,这通常是指进程;如果你实际上是指作业或任务,请避免使用进程这个词,因为它会让其他程序员感到困惑。 - Robin Green
5个回答

19
  1. 看一下优秀的java.util.concurrent包。
  2. 从单个类创建不同的线程对象没有性能陷阱。

这里是一个简短的例子:

private static class SomeTask implements Runnable
{
  @Override
  public void run()
  {
    doSomething();
  }
}

public static void main(String[] args)
{
  ExecutorService executor = Executors.newCachedThreadPool();
  for (int i = 0; i < 8; i++) executor.execute(new SomeTask());
}

3

我个人会选择选项(1)(创建两个不同的同类线程)。

我认为没有必要为可以由同一类的两个不同线程完成的工作创建两个不同的类。


3

我认为你可以任意选择实现方式。如果你需要大量短暂的线程,可能需要使用线程池,可以参考java.util.concurrent.Executors。通常我会创建一个匿名的runnable类型类,例如:

executor.execute(new Runnable() {
    //thread code goes here
});

2

通过继承Thread或者实现Runnable接口并使用new Thread(runnable)创建线程,在性能方面几乎没有区别。使用一个类还是多个类也无关紧要。你应该根据要完成的工作设计你的类结构;如果两个线程在不同的数据上执行相同的工作,请为两个线程使用同一个类。

访问共享数据(无论是静态类变量还是其他数据)始终是一个大问题。


0
主要的区别在于你设计的对象层次结构: 如果你扩展Thread类,就不能扩展任何其他类(Java是单继承)。因此,通过实现Runnable接口,你仍然可以扩展你领域模型中的其他类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接