如何多线程化这个代码示例?

时间:2011-08-25 14:12:01

标签: java multithreading simulation

我想模拟分布式系统以及机器如何工作,采用的拓扑结构是集中式的,我有很多小系统,其中每个子系统采用这种拓扑结构,我的意思是我认为我的分布式系统由许多集中系统。 我创建了一个简单的离散事件模拟器,它模拟了一个集中式系统的工作,代码如下:

public class SimuleOnesystem { 
// a set of parameters
class Arrival{// here we simulate the arrival of works to a server
 // the code..
}
class Service{// here we simulate the services  }
class Departure{// means that the work is well done
 }
}

我的问题是,我怎么能多线程化这段代码,我的意思是我想在每个系统都有自己的模拟时钟,eventList等的同时执行5个集中式系统,这些系统可以进行通信在发送和接收请求以及执行工作等方面相互之间......

提前致谢。

3 个答案:

答案 0 :(得分:0)

在最基本的层面上,您所要做的就是让SimuleOnesystem成为ThreadRunnable - 然后从驱动程序(例如main方法) ,根据需要创建尽可能多的线程并start

答案 1 :(得分:0)

我不是说这是一个轻率的答案,但是:Java Concurrency In Practice,现在就买......

但更严重的是,你现在正在迅速进入一个非常毛茸茸的测试场景。我不相信您将不得不使用java.util.concurrent.ExecutorService,但如果要在线程之间进行通信,则需要注意具有线程安全的通信通道(简单List每个模拟线程之间的s,MessageQueue,数据库表等。

答案 2 :(得分:0)

除了引入线程之外,正如其他答案中已经指出的那样,您对ring bearer's answer的评论是正确的:您必须处理事件列表和模拟时钟

据我所见,您的示例是一个相当典型的 discrete-event simulation 。尝试并行化这些,即使只是跨越线程,即在单个地址空间中(由单个机器上的相同JVM执行,可能具有多个内核等),并不是非常简单。我建议你先阅读一些关于此事的介绍性材料(我建议this book)。

你的基本问题是你不能阻止某些线程比其他线程更快地执行(例如因为它们必须处理更少的负载),因此它们的本地时钟可能会进入模拟的“未来”。如果其他线程之一,即一个滞后的线程,现在发出一个新的事件/消息,该事件/消息必须由一个时间太长的线程处理,一切都会中断(或者安静地失败并且无效) 。想想今天打开你的邮箱并收到去年的邮件,你也应该立即回复......

防止此类情况发生的算法称为同步算法。这些基本上有两种:乐观方法允许发生此类 straggler事件(来自过去的消息),但检测它们并在必要时清除任何不一致。但是,在您的情况下,首先查看保守算法似乎是可取的,这样可以完全避免使用这些方法。它们(通常)更容易实现,但只有在事件的发送者与事件必须执行的时间之间存在某些延迟时才能正常工作(例如,请参阅this classical paper了解详细信息,或this more recent one详细介绍了使用保守同步的基于Java的仿真系统。 如果您有适当的同步算法,它还将管理您的本地模拟时钟。

由于实现这些算法非常耗时,您还可以考虑使用一些已经提供方法的基于Java的仿真框架或库(这是一个众所周知的问题)。