在处理我的Java应用程序时,我有一个简单的多线程案例(一个异步资源加载器线程和一个主线程等待加载器完成,用进度更新UI),我想通过调用来解决
while( !foo.isInitialized() ) {
Thread.yield();
}
Run Code Online (Sandbox Code Playgroud)
在主线程中.我知道有更强大的解决方案; 仍然,加载器不是由我设计的,它是一个基本上只读的库(我不能简单wait(),因为我无法让它发送给我notify();也就是说,它完成后不会死),我只需要等到加载完成.
Java doc说(注意这不存在于1.6文档中,并且是由1.7个文档添加的)
使用这种方法很少是合适的.
NetBeans警告我
方法
yield()on的调用java.lang.Thread通常用于伪装同步问题,应该避免.
谷歌Codepro AnalytiX,OTOH说
Thread.yield()不应使用该方法,因为其行为在所有平台上都不一致.
我是否应该关注这些警告并尝试找到更好的解决方案(欢迎提出所有建议),还是应该将其视为"警告噪音"并抑制/忽略它们?
注意:我想到了使用sleep()(Is Thread.sleep(0)和Thread.yield()语句等效的明显可能性吗?值得一提); 仍然,如果yielding在持续睡眠中没有"奖励",为什么Java会提供它 - 那么它的实际有效用例是什么呢?
我搜索了这个问题,但没有看到答案.如果它是重复的,我很乐意关闭它.
我目前正在尝试对某项技术进行一些性能评估,并看到一些相当令人难以置信的结果,所以我决定尝试一些.在那我想试着看看秒表类是否回归了我的预期.
Stopwatch sw = Stopwatch.StartNew();
Thread.Sleep(1);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我几乎看到了15毫秒的返回值.我理解DateTime的分辨率在那附近但是不应该Thread.Sleep(1)睡一个线程1ms?我所使用的系统返回Stopwatch.IsHighResolution true并在.NET 4中运行.
背景:此代码以完整和正确的形式用于收集有关Aerospike db get请求的一些数字.数据库不在同一个盒子里.当我在查询处于中间时打印出sw.ElapsedMilliseconds时,我看到的主要是亚毫秒响应,这听起来有点怀疑,因为我的Java等效代码在大多数情况下返回更加可信的5ms-15ms响应.Java代码使用的是System.nanoTime()的区别.通过我的C#代码中的submilli响应,我的意思是Console.WriteLine(sw.ElapsedMilliseconds)打印0.
所以我正在将这款智能手机应用程序模拟到Windows.这是一个运行它的逻辑和绘制方法的游戏1/60.这是毫秒16.6667
我实现了这个游戏循环:
private const double UPDATE_RATE = 1000d / 60d;
private void GameLoop()
{
double startTime;
while (GetStatus() != GameStatus.NotConnected)
{
startTime = Program.TimeInMillis;
//Update Logic
while (Program.TimeInMillis - startTime <= UPDATE_RATE)
{
//Thread.Yield(); it consumed CPU before adding this too, adding this had no effect
Thread.Sleep(TimeSpan.FromTicks(1));//don't eat my cpu
}
}
Debug.WriteLine("GameLoop shutdown");
}
Run Code Online (Sandbox Code Playgroud)
Program.TimeInMillis来自一个NanoStopwatch班级,以毫秒为单位返回时间double.这很有用,因为这个游戏循环必须非常准确才能使一切正常.
你可能知道,这里Thread.Sleep会耗费大量的CPU.可能是因为它需要int millis将我转换TimeSpan为0毫秒.
我最近遇到了这个叫做的东西WaitHandle,但我看到的一切都用了int millis.我真的需要让这个准确,所以我真的需要double millis …