相关疑难解决方法(0)

Thread.yield()被认为有害吗?

在处理我的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会提供它 - 那么它的实际有效用例是什么呢?

略有关联: Thread.yield()有更好的解决方案吗?&Thread.Sleep或Thread.Yield

java multithreading coding-style yield

14
推荐指数
1
解决办法
1459
查看次数

Thread.Sleep(1)花费的时间超过1毫秒

我搜索了这个问题,但没有看到答案.如果它是重复的,我很乐意关闭它.

我目前正在尝试对某项技术进行一些性能评估,并看到一些相当令人难以置信的结果,所以我决定尝试一些.在那我想试着看看秒表类是否回归了我的预期.

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.

.net c#

9
推荐指数
2
解决办法
2845
查看次数

睡眠/等待而不消耗CPU

所以我正在将这款智能手机应用程序模拟到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 …

c# game-loop

-1
推荐指数
1
解决办法
781
查看次数

标签 统计

c# ×2

.net ×1

coding-style ×1

game-loop ×1

java ×1

multithreading ×1

yield ×1