Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现多个';螺纹';仅在一个线程中运行_Java_C_Multithreading_Scala_Actor - Fatal编程技术网

Java 如何实现多个';螺纹';仅在一个线程中运行

Java 如何实现多个';螺纹';仅在一个线程中运行,java,c,multithreading,scala,actor,Java,C,Multithreading,Scala,Actor,最近我一直在想:他们如何在一个线程中实现多个“线程” 我的意思是,他们如何在一个线程中实现几个并行运行的代码?他们如何保存“线程”的状态,创建一个中断并将CPU传递给下一个 我认为Scala参与者实现了这一点。但是怎么做呢 这可以用JVM或C来回答,这无关紧要。我真的很想学习它的理论。一种方法是让用户代码中的线程包自己注册,以从内核获得某种计时器中断。每当它收到这样一个中断时,它都可以告诉内核停止执行所有本身运行多个不同线程的内核线程。对于这些线程中的每一个,计时器中断代码可以检查这些线程的堆栈

最近我一直在想:他们如何在一个线程中实现多个“线程”

我的意思是,他们如何在一个线程中实现几个并行运行的代码?他们如何保存“线程”的状态,创建一个中断并将CPU传递给下一个

我认为Scala参与者实现了这一点。但是怎么做呢


这可以用JVM或C来回答,这无关紧要。我真的很想学习它的理论。

一种方法是让用户代码中的线程包自己注册,以从内核获得某种计时器中断。每当它收到这样一个中断时,它都可以告诉内核停止执行所有本身运行多个不同线程的内核线程。对于这些线程中的每一个,计时器中断代码可以检查这些线程的堆栈,在辅助位置记录重要信息(寄存器、堆栈指针、程序计数器等),然后加载在该实际线程上运行的另一个模拟线程的存储信息。然后,它可以恢复运行模拟线程的内核线程。通过这种方式,您可以模拟在单个内核线程上运行的多个线程之间的上下文切换

要实现类似于锁定的功能,您可以在本地跟踪用户空间中的所有锁定信息。每当模拟线程尝试获取锁时,您都可以检查该线程是否能够成功获取锁。如果是这样的话,你就把锁给它。否则,您可以通过交换真实线程上运行的模拟线程来模拟上下文切换,然后将模拟线程标记为阻塞,直到锁再次释放


这只是一个开始-这里还有很多其他细节(如果其中一个模拟线程尝试执行阻塞I/O操作会怎么样?您不能只阻塞内核线程,因为这会停止所有模拟线程!),但这就是这个想法的要点。

您是指ExecutorService中的任务还是Java中的ScheduledExecutorService

这些任务被添加到队列中并执行到完成。当一个完成另一个开始。如果有延迟的循环,则可以使用重复计划任务。它为每个迭代完成,并允许运行其他任务

如果您想了解更多详细信息,您可能会发现阅读代码很有趣。

使用我认为您在这里很困惑

协同程序在准备好执行时放弃控制,没有任何中断,所以关于中断的问题在这里是无关的。Scala参与者作为协同程序实现


绿色线程是由虚拟机实现的用户模式线程,不使用本机操作系统功能。显然,虚拟机可以将任何指令插入正在执行的代码中,以检查是否需要切换到另一个线程。

对于actors,它很简单,而不是每个actor使用一个线程,而是使用同一个线程为多个actor执行消息。但是,如果某个参与者执行阻塞调用或繁重的计算,则必须使用另一个线程来执行其他参与者中的消息

绿色线程是可以在VM级别实现的轻量级线程。绿色线程始终映射到一个或多个OS线程。VM在用户空间中处理同步和线程切换,这可以显著减少开销。但是,绿色线程也有缺点,例如IO调用可能会导致线程阻塞,然后VM无法将OS线程“重用”为另一个绿色线程,而必须使用其他OS线程


另一个解决方案是使用continuations,这是在Scala编译器中实现的。然后在JVM字节码级别处理执行的中断和恢复,在这里保存和恢复本地状态。不需要虚拟机支持。

是actors模型的一个非常好的实现。它有一个非常好的直接Java API(除了Scala API),而且。

我认为问题更多的是如何在一个内核线程上实现n个线程的抢占式多线程。@Jose Leal,你是说像线程一样吗?当线程/线程池中有轻量级任务,并且线程已经可以共享一个CPU时,线程中的线程会给您带来什么好处?