【问题标题】:Simulating threads scheduling in java (stackless java?)在java中模拟线程调度(stackless java?)
【发布时间】:2012-06-16 17:28:24
【问题描述】:

对于一些学术研究,我需要模拟在单个处理器上运行的多个线程。

我希望能够在我的代码中插入 *call_scheduler()* 调用,其中当前的“线程”将暂停(记住它在哪个代码行),并且一些调度函数将决定放开哪个线程。

在 python 中,这可以使用 stackless python 巧妙地实现。有java替代品吗?

我可以使用真正的线程和一些消息队列(或管道)来实现它,这将强制一次只运行一个线程 - 但这是一个丑陋且有问题的解决方案。

【问题讨论】:

  • 我认为在 java 中没有明确的方法可以做到这一点,您只需编写几行代码即可使用信号量和优先级队列

标签: java scheduling python-stackless stackless


【解决方案1】:

对于协作用户线程,您可以使用 Apache javaflow 延续: http://commons.apache.org/sandbox/javaflow/

我很想知道如何使用此延续包实现抢占式调度程序

【讨论】:

    【解决方案2】:

    像 Akka 这样的 Scala 演员框架就是这样做的。每个线程处理许多演员,这就是他们如此高效地创建的方式。我建议看看他们的源代码。

    【讨论】:

      【解决方案3】:

      你的问题:

      我可以使用真正的线程和一些消息队列(或管道)that will force only one thread to run at a time 来实现它 - 但这是一个丑陋且有问题的解决方案

      如果你希望一次只运行一个线程,通过以更简洁的方式控制线程对对象的访问,然后使用Semaphores in java.util.concurrent package.

      Semaphores sem = new Semaphores(1); //这里的1表示只有一个线程可以访问

      使用sem.acquire() to get the key of the object, and when its done, use sem.release(),那么只有另一个线程可以访问这个对象。

      【讨论】:

      • 但我希望能够从调度程序线程控制哪个线程将继续执行 - 所以我需要一个信号量数组,每个线程一个。
      • 创建一个信号量的HashMap,这样你就可以通过它们的键来识别它们,比如first_thread、second_thread...等
      • 本机调度程序是否足够聪明,能够理解所有线程都在等待信号量并且只有一个线程可以处于活动状态 - 所以没有理由暂停它?
      • Kumar Vivek Mitra - 每个线程和数组的唯一索引有什么问题?
      • 使用新的并发包,你可以放心线程安全,就是这样......就像如果你想要线程安全使用StringBuffer类,否则使用StringBuilder......这里的区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2016-12-23
      • 2017-04-15
      • 1970-01-01
      相关资源
      最近更新 更多