0

问题是,是否有可能有一个外部线程,或者他们必须在他们运行的班级内部。如果是这样,有人可以告诉我怎么做。(外螺纹)

4

1 回答 1

3

线程,或者更准确地说,执行线程是某种东西,而类Thread是密切相关但又不同的东西,您似乎混淆了这两个概念。

您可以将执行线程视为将按顺序执行操作的机器。定义和运行这种机器的一种方法是编写一个MyClass带有main()方法的类并调用java MyClass.

另一种方法是创建Thread类的新实例并调用其方法start()。这将创建一个新的执行线程,它将运行类run()方法中的代码,Thread默认情况下不执行任何操作。为了使它有用,您通常会覆盖该run方法,我认为您正在调用该类内部的线程...

class MyThread extends Thread {
  @Override public void run() {
    // ... some code ...
  }
}
// ...
  final Thread t = new MyThread();
  t.start();

在此示例中,在run()类的方法MyThread返回后,与该实例关联的执行线程MyThread将终止(就像您的单线程程序从您的方法返回或到达您的main()方法的末尾时一样)。

另一种可能性是传递Threada 的实例Runnable。然后你将两个概念分开:执行线程,由 的实例表示Thread,将执行 的实例中的代码Runnable

class MyRunnable implements Runnable {
  @Override public void run {
    // this code will get executed by a thread
  }
}
  // ...
  final MyRunnable r = new MyRunnable();
  final Thread t = new Thread(t);
  t.start();

这可能更接近于您所说的外部线程,尽管这种命名法非常不合常规。

因此,您会看到这里有 2 个不同但密切相关的概念。

现在,在 Java 中,您可以创建一个执行线程,等待您给它一些代码来执行。创建后,它会进入一个pool并坐在那里。你提交一些代码让它运行,当它完成时,执行线程不会终止,而是保持活动状态并返回到那个pool。也许这就是你要找的。

为此,您通常使用ExecutorService. 例如:

class MyMainClass {
  private static final ExecutorService es = Executors.newFixedThreadPool(10);
  public static void main(String... args) {
    es.submit(new MyRunnable());
    es.submit(new MyRunnable());
    es.submit(new MyRunnable());
    es.submit(new MyRunnable());
    es.submit(new MyRunnable());
  }
}

在此示例中,包含 10 个执行线程。你可以为它提交任意数量的实例Runnable,它会将它们分布在 10 个线程中。submit(...)对on 的每次调用ExecutorService都会返回一个 的实例Future,您可以使用它来了解正在运行的执行线程Runnable是否已经完成,以及它是成功完成还是由于未捕获的异常。

我建议您查看我在这里提到的所有类的 javadocs :ThreadRunnableExecutorService和. 从该文档中可以学到很多东西!ExecutorsFuture

最后一点,请记住,如果您开始使用线程和ExecutorServices,您会感到各种头痛。您将不得不考虑执行无法继续的情况(死锁、活锁)、需要原子的操作(即,从不同线程递增变量)、内存可见性(即,如果您更改字段的值如果不“小心”,其他线程可能永远不会注意到该字段的更改!)。还要记住,在每个最后一个非守护线程完成之前,JVM 不会死。换句话说,上面的例子永远不会终止,即使所有提交Runnable的s都完成了,因为里面的执行线程ExecutorService还活着!

于 2013-03-10T06:08:28.657 回答