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

java外部线程(在所使用的类文件之外),java,multithreading,class,external,internal,Java,Multithreading,Class,External,Internal,问题是,是否可能有一个外部线程,或者它们必须在它们运行的类的内部。如果是的话,有人能告诉我怎么做吗。(外部线程)线程,或者更准确地说,执行线程是某种东西,类thread是一种密切相关但又不同的东西,您似乎混淆了这两个概念 您可以将执行线程视为一台按顺序执行操作的机器。定义和运行此类机器的一种方法是使用main()方法编写类MyClass,并调用javamyclass 另一种方法是创建Thread类的新实例,并调用其方法start()。这将创建一个新的执行线程,该线程将运行thread类的run(

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

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

您可以将执行线程视为一台按顺序执行操作的机器。定义和运行此类机器的一种方法是使用
main()
方法编写类
MyClass
,并调用
javamyclass

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

在本例中,在类
MyThread
run()
方法返回后,与
MyThread
实例相关联的执行线程将终止(就像单线程程序从
main()
方法返回时一样)

另一种可能是向
线程
传递
可运行
的实例。然后将这两个概念分开:执行线程(由
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();
这可能更接近你所说的外螺纹,尽管这个命名法非常不传统

因此,您可以看到这里有两个不同但密切相关的概念

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

为此,您通常使用
执行器服务
。例如:

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个线程中。在
ExecutorService
上对
submit(…)
的每次调用都会返回一个
Future
的实例,您可以使用该实例了解运行
Runnable
的执行线程是否已经完成,以及它是否成功完成或由于未捕获的异常

我建议您查看我在这里提到的所有类的Javadoc:
Thread
Runnable
ExecutorService
Executors
Future
。从这些文档中可以学到很多东西

最后,请记住,如果您开始使用线程和执行器服务,您将遇到各种各样的麻烦。您必须考虑执行无法继续的情况(死锁、活锁)、需要原子化的操作(即,从不同线程递增变量)、内存可见性(即,如果您在不“注意”的情况下更改字段的值),其他线程可能永远不会注意到该字段的更改!)。还要记住,直到最后一个非守护进程线程完成,JVM才会消亡;换句话说,上面的示例永远不会终止,即使所有提交的
Runnable
s都已完成,因为
ExecutorService
中的执行线程仍然处于活动状态

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

您可以将执行线程视为一台按顺序执行操作的机器。定义和运行此类机器的一种方法是使用
main()
方法编写类
MyClass
,并调用
javamyclass

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

在本例中,在类
MyThread
run()
方法返回后,与
MyThread
实例相关联的执行线程将终止(就像单线程程序从
main()
方法返回时一样)

另一种可能是向
线程
传递
可运行
的实例。然后将这两个概念分开:执行线程(由
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();
这可能更接近你所说的外螺纹,尽管这个命名法非常不传统

因此,您可以看到这里有两个不同但密切相关的概念

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

要做到这一点,