gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:57:49 24 4
gpt4 key购买 nike

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

最佳答案

一个线程,或者更准确地说,一个执行线程是某种东西,而类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() 方法的末尾)。

另一种可能性是向 Thread 传递 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 中,您可以创建一个执行线程,该线程将等待您为其提供一些要执行的代码。创建后,它会进入一个,并坐在那里。您提交一些代码让它运行,当它完成时,执行线程不会终止,而是保持 Activity 状态并返回到该。也许这就是您正在寻找的。

为此,您通常使用 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 的实例,您可以使用它来了解运行 Runnable执行线程是否已经完成,以及它是否成功完成或由于未捕获而完成异常。

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

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

关于java外部线程(在它使用的类文件之外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15319415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com