nul*_*ptr 5 java concurrency networking multithreading
我想用 Java 模拟 TCP。
为此,我有多个线程,例如每个 TCP 连接的发送方和接收方线程。
我的问题是,我想暂停(如 Thread.sleep())线程几微秒的时间间隔。这样我就可以模拟流量控制,发送者线程在发送下一个数据包之前会阻塞几微秒,同时 CPU 可以被接收和数据处理线程使用。但是我找不到任何执行 sleep() 或 wait() 以获得微秒或纳秒分辨率的方法。如何以微秒或纳秒分辨率在 Java 中阻塞(暂停)线程?
我找到了 System.nanoTime() 方法,但没有在指定的微秒或纳秒内阻塞线程的方法。如果有任何这样的方法,请告诉我。System.nanoTime() 仅给出以纳秒为单位的相对时间间隔。
我可以使用 System.nanoTime() 在使用忙循环的线程中执行纳秒延迟,但这会浪费 CPU,而 CPU 本来可以用于接收数据线程或处理线程。
另一个令人困惑的问题:
通过网上冲浪,我发现 Thread.sleep() 或 wait() 方法在 Windows 系统中阻塞至少指定的毫秒或 10 毫秒的倍数,以较小者为准,没有线程中断。但是当我运行示例示例时,我发现了非常不同的结果。就像线程的睡眠时间少于指定的毫秒。有些线程给了我 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);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的带有 Intel Core i5, 2.53 GHz 的系统中,我在多次运行中得到类似于下面的输出。*这篇文章中没有打印下面输出中的换行符,我已经从控制台复制了输出,但是它在我的控制台中给了我换行符,这不是问题。
线程 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
请指导我。
为长篇道歉。感谢您阅读整篇文章。
| 归档时间: |
|
| 查看次数: |
6159 次 |
| 最近记录: |