我正在模拟在Web服务器上执行的Web请求.Web服务器是通过一个简单的线程池对象来模拟的,该对象接受来自队列的请求 由工人经营。由于Web请求可能是静态的(I / O绑定)或动态的(CPU绑定)所以我将Web请求模拟为CpuBoundJob和IoBoundJob,它们是Runnable对象,如下面的代码所示.sleep方法中的睡眠时间指定静态的时间量网页需要从磁盘读取并发送到Web客户端。在IoBoundJob的情况下,问题是Thread.sleep(),这不精确,并且IoBoundJob在不同的运行中可以有不同的响应时间。这是相同的静态请求可能由不同的Web客户端采用不同的响应时间(对于静态请求,响应时间不是100%准确)。毫无疑问 Thread.sleep()不精确,可以睡眠超过指定但我认为这是Thread.sleep()的美丽,当它用于模拟任何IO绑定作业(静态Web请求)时,因为在IoBound作业的情况下, Io完成它没有必要立即抓住处理器并完成其运行,而是当其I / O完成时,可能需要一点时间等待处理器忙于其他工作。
我的看法是否正确?如果它不对,那么在我的仿真项目场景中Thread.sleep()的精确替代是什么?我无法使用spin交换Thread.sleep(),因为我在以下代码中使用了CPU绑定作业的旋转。
public class CpuBoundJob Runnable {
long delay;
public CpuBoundJob(long delay) {
this.dlay=delay;
}
@Override
public void run() {
long timeToWait = this.delay;
long startTime = System.currentTimeMillis();
while(startTime + timeToWait > System.currentTimeMillis());
}
}
public class IoBoundJob implements Runnable {
long delay;
public IoBoundJob(long delay) {
this.dlay=delay;
}
@Override
public void run() {
try{
Thread.currentThread().sleep(this.delay);
}catch(InterruptedException e){ }
}
}