当前位置: 首页 > 知识库问答 >
问题:

Java线程调度

倪举
2023-03-14

我有一个MainClass,一个Worker类和一个Supervisor类。在MainClass中,我创建了10个Worker类和一个Supervisor类,它们在不同的线程中运行。

class MainClass {

   public static void main(String args[]) {

   for (int i=0; i<10 ;i++) {
      Thread t = new Thread( new Worker());
      t.start();
   }

   (new Thread(new Supervisor()).start();

}

.

class Worker extends Thread {
  public void run() {
    while(true) {
      if(some_condition) {
        //do stuff
      } else {
        // pause thread execution for undefined time.
      }
    }
  }
}

.

class Supervisor extends Thread {
  public void run() {
    while(true) {
      if(some_condition) {
        // restart Workers thread that are paused.
      } 
      // do other stuff
    }
  }
}

我不知道如何实现这个,因为每个线程中的条件是相互独立的,所以我不需要同步,所以我不能使用等待通知。

共有2个答案

仲孙献
2023-03-14

据我所知,你想创建单独的线程池,其中包括10个工人或根据你的要求的数字。

就池而言,您可以在java中检查ThreadPoolExecutor。util。并发api。在内部ThreadPoolexecutor还为运行任务创建工作线程。

尝试阅读ThreadPoolExecutor它可能会帮助您或请详细说明您的问题您希望通过这个问题实现的最终目标是什么。

柯星华
2023-03-14

我不知道如何实现这个,因为每个线程中的条件是相互独立的,所以我不需要同步,所以我不能使用等待通知。

你当然可以。

这里的微妙之处在于,可能Supervisor实际上并不知道工作线程是否真的暂停了。(如果知道,那么条件不是独立的。)

由于Supervisor不知道线程是否真的暂停了(根据假设),所以如果它试图取消已经暂停的线程,您必须设计您想要发生的事情。

a) 一个不支持的人应该什么都不做吗?

b) 或者下次员工试图暂停时,它是否应该立即取消暂停?

如果答案是(b),那么你必须担心线程安全。如果答案是(a),那么您就不会这样做(除非您有其他一些数据要在线程之间传递!)

无论哪种方式,您仍然可以使用等待和通知。

 类似资料:
  • 主要内容:1 Java 线程调度程序,2 抢占式调度与时间片调度的区别1 Java 线程调度程序 Java中的线程调度程序是JVM(Java虚拟机)的一部分,它决定应该运行哪个线程。 我们无法保证线程调度程序将会选择哪个线程来运行。 一次只能在一个进程中运行一个线程。线程调度程序主要使用抢占式或时间片调度来调度线程。 2 抢占式调度与时间片调度的区别 在抢占式调度下,最高优先级的任务会一直执行,直到进入等待状态或死机状态或存在更高优先级的任务为止。 在时间分片调度下

  • 本文向大家介绍Java线程调度之线程休眠用法分析,包括了Java线程调度之线程休眠用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Java线程调度之线程休眠用法。分享给大家供大家参考。具体分析如下: Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。   这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而

  • 调度器 调度器的算法有许多种,我们将它提取出一个 trait 作为接口 os/src/algorithm/src/scheduler/mod.rs /// 线程调度器 /// /// 这里 `ThreadType` 就是 `Arc<Thread>` pub trait Scheduler<ThreadType: Clone + Eq>: Default { /// 优先级的类型 t

  • 问题内容: 我最近开始学习和探索Java中GUI编程的基础知识。 经过一段时间的编程,我只完成了后端工作或其他工作,因此,我最接近用户界面的是命令控制台(令人尴尬的是,我知道)。 我正在使用Swing,据我所知,通过扩展,我也正在使用AWT。 我的问题基于以下代码: 我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件分派线程”一词。如果我错了,请纠正我,但据我了解;它与使用多

  • 不管什么原因,我的回拨电话打不通。基本上,我将使用我创建的tcp服务器进行群组聊天。我试图在java中创建一个线程,然后使用回调将我从套接字获得的信息提供给主活动。 当前收到得错误: 客户端任务 最后,我想通过响应事件传递一个字符串,它将获得它的主要内容。

  • 我读到java中的线程调度程序在单个进程中每次只运行一个线程。 假设我们有一个JVM运行一台CPU机器。因此,如果我启动10个线程,它们将由同一个线程调度程序管理。