java - java中同步对象是如何工作的

标签 java android multithreading android-fragments

我正在制作一个基本的 Android 游戏,我有一个显示游戏世界的 fragment 。当我打开该 fragment 时,我创建了一个新线程,它只是等待我的 NetworkThread 从服务器获取世界。另外,我的 GetWorldThread 是一个 static Thread,我仅在 fragment 内初始化它。

这就是我的 GetWorldThread 的样子:

synchronized (this)
{
    try 
    {
        Log.d("getWorldThread", "waiting()");
        wait();
    } 
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }  
}

我的NetworkThread看起来像这样

if (buffer instanceof World)
{
    synchronized (WorldFragment.getWorldThread)
    {
        World.setWorld(((World) buffer));                
        Log.d("NetworkThread", "notifying World");

        WorldFragment.getWorldThread.notify();
    }

}

我的代码可以工作,但我想知道是否有一种方法可以更优雅地做到这一点?

最佳答案

documentation 中所述您始终应该在 while 循环中使用 wait() 。因此您的代码可能无法正常工作。

更优雅的方式是使用更多高级抽象。例如Future和标准 FutureTask。这种方式允许您不编写循环之类的低级内容,从而避免错误。

更新:另请注意,有 Conditions/Lock 用于 wait/synchronyzed 替换为描述here 。事实上,使用 wait() 在 2017 年已经过时了

关于java - java中同步对象是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43084720/

相关文章:

c++ - boost C++ 无锁队列与共享队列

java - Spring cloud config server ssh to bitbucket问题

java - 如何使用数据库中的数据填充 JavaFX ChoiceBox?

android - PagerTitleStrip 在我 View 的顶部*和*底部保留空间

android - Jetpack Compose 中按钮的背景颜色

java - 如何判断 ListView 中选定的索引是文件还是目录?

C# 系统 CPU 使用率和与 Windows 任务管理器同步

java - Android在更新后仍然坏了

java - 在 Delphi 或 Java 中保持窗口位于顶部

java - ConcurrentHashMap 如何处理重新散列?