java外部线程(在它使用的类文件之外)

时间:2013-03-10 05:59:00

标签: java multithreading class external internal

问题是,是否有可能有一个外部线程,或者他们必须是他们所在的类的内部。如果是这样,有人可以告诉我如何。 (外部线程)

1 个答案:

答案 0 :(得分: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()的{​​{1}}方法返回后,与该MyThread实例关联的执行线程将终止(仅比如你的单线程程序从你的MyThread方法返回 - 或者到达你的main()方法结束时。

另一种可能性是传递Thread Runnable的实例。然后,您将2个概念分开:执行线程,由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中,您可以创建一个执行线程,它将等待您为其执行一些代码。创建后,它会转到,并坐在那里。你提交一些代码让它运行,当它完成时,而不是终止,执行的线程保持活着并返回到。也许这就是你要找的东西。

为此,您通常使用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(...)上对ExecutorService的每次调用都会返回Future的实例,您可以使用该实例来了解正在运行您的{{1> 执行线程已完成,如果成功完成或由于未捕获的异常。

我建议你看一下我在这里提到的所有课程的javadoc:RunnableThreadRunnableExecutorServiceExecutors 。从文档中可以学到很多东西!

最后请注意,如果你开始玩线程和Future,你会遇到各种各样的麻烦。您将不得不考虑执行无法执行的情况(死锁,活锁),需要原子的操作(即,从不同线程递增变量),内存可见性(即,如果您更改字段的值)没有“照顾”,可能会发生其他线程永远不会注意到该字段的更改!)。还要记住,在每个最后一个非守护程序线程完成之前,JVM不会消亡;换句话说,即使所有提交的ExecutorService完成,上面的示例也永远不会终止,因为Runnable中的执行线程仍然存在!