我想用Java模拟TCP。
为此,我有多个线程,例如每个TCP连接的发送者和接收者线程。
我的问题是,我想暂停(如Thread.sleep())线程数微秒的时间间隔。这样我就可以模拟流控制,其中发送方线程将在发送下一个数据包之前阻塞几微秒,同时接收和数据处理线程可以使用CPU。但是我找不到任何执行sleep()或wait()的方法来获得微秒或纳秒分辨率。如何以微秒或纳秒分辨率阻塞(暂停)Java中的线程?
我找到了System.nanoTime()方法,但是没有方法在指定的微秒或纳秒内阻塞线程。如果有任何此类方法,请告诉我。 System.nanoTime()仅给出相对时间间隔(以纳秒为单位)。
我可以使用System.nanoTime()使用繁忙循环在线程中执行纳秒级延迟,但这会浪费CPU,而CPU可能已经用于接收数据线程或处理线程。
另一个令人困惑的问题:
通过上网,我发现Thread.sleep()或wait()方法在Windows System中阻塞了至少指定的毫秒数或10ms的整数倍,以较小者为准,并且没有线程中断。但是,当我运行示例示例时,我发现了截然不同的结果。类似线程的睡眠时间少于指定的毫秒数。一些线程使我100微秒的睡眠。时间误差测量了吗? System.nanoTime()不够准确吗?参见下面的示例,我得到的结果截然不同。线程优先级也无法给出预期的结果。
public class MyClass {
public static void main(String args []){
Runnable r = new Runnable() {
public void run() {
long s = System.nanoTime();
//Thread.yield(); // Try for yield, need to check - in how much time high priority thread will be scheduled back after yielding
try{
Thread.sleep(1);
}catch(Exception e){
}
long e = System.nanoTime() - s;
System.out.println(Thread.currentThread().getName()+e);
}
};
Thread t1 = new Thread(r, "Thread T1: ");
t1.setPriority(Thread.MAX_PRIORITY);
t1.start();
Thread t2 = new Thread(r, "Thread T2: ");
t2.setPriority(Thread.MIN_PRIORITY);
t2.start();
Thread t3 = new Thread(r, "Thread T3: ");
t3.setPriority(Thread.NORM_PRIORITY);
t3.start();
Thread t4 = new Thread(r, "Thread T4: ");
t4.setPriority(Thread.MAX_PRIORITY);
t4.start();
long s = System.nanoTime();
try{
Thread.sleep(1);
}catch(Exception e){
}
long e = System.nanoTime() - s;
System.out.println("Main: "+e);
}
}
在具有2.53 GHz Intel Core i5的系统中,多次运行时,我得到类似以下的输出。 *此输出中未打印下面输出中的换行符,我已从控制台复制了输出,但它在控制台中给了我换行符,这没问题。
螺纹T1:736682
线程T3:700212
线程T2:478559
主:548257
螺纹T4:458299
第二次-
线程T3:27555
线程T2:139799
螺纹T1:152361
主线:93199
线程T4:29986
第三轮-
螺纹T4:724525
线程T2:1050319
主:752486
螺纹T1:941316
线程T3:1000883
第四轮-
螺纹T1:174243
螺纹T2:166543
线程T3:1005745
主:1023170
线程T4:915787
在以上运行中,我得到了微秒级的阻塞。 :O
请指导我。
很久很抱歉。感谢您阅读全文。
最佳答案
您受OS线程调度程序的支配,对此您无能为力。仅仅因为您睡眠时间很短并不意味着调度程序将在完成睡眠后立即唤醒您的线程。而且线程优先级只是一个提示,没有任何保证。