|
|
|
|
/** |
|
* @author Jerry Lee |
|
*/ |
|
public class Testee { |
|
static long countTimeIn500ms = 0; |
|
|
|
public static void main(String[] args) throws Exception { |
|
countTimeIn500ms = guessCountTimeIn500ms(); |
|
|
|
Thread runAndSleepTask = new Thread(new RunAndSleepTask(), "RunAndSleepTask"); |
|
Thread runAndWaitTask = new Thread(new RunAndWaitTask(), "RunAndWaitTask"); |
|
Thread runAndLongSleepTask = new Thread(new RunAndLongSleepTask(), "RunAndLongSleepTask"); |
|
|
|
runAndSleepTask.start(); |
|
runAndWaitTask.start(); |
|
runAndLongSleepTask.start(); |
|
|
|
System.out.println("Tasks started!"); |
|
Thread.sleep(Long.MAX_VALUE); |
|
} |
|
|
|
public static class RunAndSleepTask implements Runnable { |
|
@Override |
|
public void run() { |
|
String name = this.getClass().getSimpleName(); |
|
while (true) { |
|
for (long i = 0; i < countTimeIn500ms; i++) { |
|
} |
|
System.out.println(name + ": " + new Date()); |
|
try { |
|
Thread.sleep(500); |
|
} catch (InterruptedException e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
public static class RunAndWaitTask implements Runnable { |
|
@Override |
|
public void run() { |
|
String name = this.getClass().getSimpleName(); |
|
while (true) { |
|
for (long i = 0; i < countTimeIn500ms; i++) { |
|
} |
|
try { |
|
System.out.println(name + ": " + new Date()); |
|
synchronized (this) { |
|
this.wait(500); |
|
} |
|
} catch (InterruptedException e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
public static class RunAndLongSleepTask implements Runnable { |
|
@Override |
|
public void run() { |
|
String name = this.getClass().getSimpleName(); |
|
while (true) { |
|
for (long i = 0; i < countTimeIn500ms; i++) { |
|
} |
|
System.out.println(name + ": " + new Date()); |
|
try { |
|
Thread.sleep(5000); |
|
} catch (InterruptedException e) { |
|
e.printStackTrace(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* @return 100ms可以做{@code long}的计数次数。 |
|
*/ |
|
static long guessCountTimeIn500ms() { |
|
System.out.println("start guess."); |
|
|
|
long count = 1000L * 1000 * 1000; |
|
|
|
// simple warm-up |
|
for (long i = 0; i < count; i++) { |
|
// nothing! |
|
} |
|
|
|
long tick = System.currentTimeMillis(); |
|
for (long i = 0; i < count; i++) { |
|
// nothing! |
|
} |
|
long duration = System.currentTimeMillis() - tick; |
|
System.out.printf("1G times count take %d ms.\n", duration); |
|
|
|
return count * 500 / duration; |
|
} |
|
} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗