【问题标题】:java external threads (outside the class file it's used)java 外部线程(在它使用的类文件之外)
【发布时间】:2013-03-10 05:59:00
【问题描述】:

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

【问题讨论】:

  • 是的,这是可能的。记得在 Java 1.4 之前(我相信),所有 Java 类都必须在自己的文件中
  • 我真的无法理解一些反对意见。是因为 OP 不知道正确的或最常用的术语吗?还是因为他没有在他不知道要查找的术语的主题上查找某些信息? 真的那么难理解这里的问题吗?来吧。赞成以补偿那些无法解释的反对票。

标签: java multithreading class external internal


【解决方案1】:

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

你可以把一个执行线程想象成一台按顺序执行操作的机器。定义和运行这种机器的一种方法是使用main() 方法编写一个类MyClass 并调用java MyClass

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

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

在本例中,MyThread 类的 run() 方法返回后,与该 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 中,您可以创建一个执行线程,该线程将等待您为其提供一些代码来执行。创建后,它会进入一个,并坐在那里。您提交一些代码让它运行,当它完成时,执行线程不会终止,而是保持活动状态并返回到那个。也许这就是你要找的。​​p>

为此,您通常使用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());
  }
}

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

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

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

【讨论】:

  • 谢谢,这是我需要让一个全局运行的线程正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多