gpt4 book ai didi

Java-重用具有相同运行但不同参数的线程

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:32 24 4
gpt4 key购买 nike

我在思考线程时仍然遇到了一些麻烦,我正在尝试以尽可能简单的方式来做这件事。我知道线程都必须有一个从 Runnable 类继承的 run 方法,但它们也可以有其他方法,对吗?

原因是,我有一个带有一些私有(private)变量和运行方法的线程。它调用它的运行函数,一旦完成,我想用完全相同的运行方法重用线程。它做完全相同的事情,只是使用不同的变量。所以我可以添加类似 setArray 方法的东西(线程包含一个私有(private)字节数组)这样我就可以简单地用这个新数组再次调用运行,或者这是不允许的。我想简单地说,它就像

Thread thread = new MyThread();
thread.start();

// Check if the thread has finished in a non-blocking way
if (thread.isAlive() == false) {
thread.setArray(newArray)
thread.start();
}

基本上我只有固定数量的线程,当第一个线程完成运行时,我想稍微更改一下参数并让它再次运行。我不希望他们死去,这似乎是 join 所做的。

对于具体问题,我说了 4 个线程,每个线程都给定了一个更大字节数组的大小块。每个线程使用 Deflater 压缩该数组,并将其结果传递给处理同步的管理器对象。一旦第一个线程(如获得数组的第一部分的线程,而不是第一个完成的线程)完成后,它会移动到下一个未分配给线程的 block 。

我知道线程池是一个选项,但它似乎有点矫枉过正而且我真的不理解它们(我仍然对普通线程有问题)。

最佳答案

首先,最好使用标准的 Thread 类(不要将其子类化!)并将您的应用程序代码放入实现了 Runnable 的类中。这使得将您的应用程序逻辑与管理线程的问题分开变得容易得多。

其次,您必须了解 Thread 对象只调用一次 run 方法。在 run 方法返回(或因异常终止)后,Thread 对象就死了,无法复活。

所以如果你想“重用”Thread 实例,你必须安排 run 方法是一个循环,(以某种方式)等待下一件事完毕。在您意识到这一点之前,您正在实现一个线程池。

线程池还有另一种(更“现代”)的替代方法。创建一个 ExecutorService实例,并使用 submit() 方法提交 Runnable 实例执行。接口(interface) javadoc 有一个很好的用法示例,使用带有私有(private)线程池的执行程序服务实例。如果您愿意,您可以重用 Runnable 实例,但通常每次创建新实例更简单(也更安全)。

关于Java-重用具有相同运行但不同参数的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13106585/

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