为给定线程切换任务

Posted

技术标签:

【中文标题】为给定线程切换任务【英文标题】:Switching tasks for a given thread 【发布时间】:2016-11-25 20:31:55 【问题描述】:

我正在尝试使用红黑树构建调度程序。 该树将具有准备好执行的所有可运行任务。我计划编写自己的调度函数,将树中的任务之一分配给四个工作线程之一。每个线程都会定期访问调度程序以查看它是否必须继续相同的任务或切换到新任务。 现在,我怎样才能让线程停止特定任务并为其分配新任务。 暂停的任务返回树并等待其他线程继续执行。

为了简单起见,假设我没有任何变量/数据要从暂停的任务中存储。

我看到的所有资源要么使用 java 执行器服务,要么只是将单个任务分配给线程。所以,我需要一些帮助......

【问题讨论】:

简单:没办法。您可以获得的最接近的是一个特定的任务接口,每个方法调用只做一些工作。当方法返回时,您可以进行检查。 当你说:“每个线程都会定期访问调度器,看看它是否必须继续同一个任务或切换到新任务”,这意味着代码任务本身会定期调用某种yield 函数,以允许自己被换出。如果是这样,这将成为一个更可行的问题。 或者每个任务可以是它自己的线程并允许调度程序(在它自己的线程上运行)只在每个任务线程上调用suspendresume 以确保在任何给定的情况下只有 4 个正在运行片刻? suspendresume 在 Java 中已被弃用,但如果这是为了学术练习,它们可能对简单的设计很有用。 澄清一下,假设我有 4 个线程,但我可能有 24 个任务要执行。所有的任务都应该由这 4 个工作线程公平地执行。因此,我认为有一种方法可以。 现在您应该知道有抢占式和协作式多任务处理,而抢占式需要 CPU 的帮助。您的操作系统已经在使用 CPU,因此您的调度程序只能使用协作多任务... 【参考方案1】:

你只需要编写你的“任务”来完成大量工作,并且return 可以被多次调用,每次都从上次中断的地方开始。

我知道你在请求一些东西来主动中断任务,但这是无稽之谈,因为正在运行的程序将有一个活动堆栈。无法将该堆栈重新分配给另一个线程。线程可以这么说的堆栈。

因此,在 Java 中实现这一点的唯一方法是编写返回的任务,每次都有效地将堆栈弹出回起始位置。只有在这种情况下,您才能拥有一个线程池,从队列中挑选这些可重入任务,并交替调用它们。

【讨论】:

【参考方案2】:

为此使用石英,您不需要重新制作圆形,石英为您完成所有这些,只需使用。

【讨论】:

因为这是我项目的一部分,很遗憾,我不能使用石英。我必须自己构建调度程序。 嗯.. 我明白,这是一项大工作,如果您需要建筑师,请给我打电话。这是一份工作。

以上是关于为给定线程切换任务的主要内容,如果未能解决你的问题,请参考以下文章

并发编程的艺术

多任务-python实现-进程,协程,线程总结(2.1.16)

java多线程 上下文切换

java多线程 上下文切换

线程的上下文切换

线程池