Java - 如何在准确的时间内阻塞 运行 线程?

Java - How to block a running thread for an exact amount of time?

我需要我的主线程阻塞一段 特定的 时间。我目前正在开发一款 2D 游戏,它非常卡顿,因为 Thread.sleep(2) 会休眠约 17 秒,当您移动角色时,图形会稍微卡顿。有时它工作得很好(当我 运行 应用程序大约 10 次时),有时则不然。我知道 Thread.sleep(long milliseconds) 方法有延迟,但有什么方法可以避免它或替代方法吗?我已经尝试过 LockSupport.parkNanos((long)2e6) 但这并没有改变任何东西。

您提到的是图形,所以我假设您使用的是 Swing 或 JavaFX。阻塞 UI 线程通常不是一个好主意,因为它必须做很多工作,它会为您抽象掉。 如果您使用的是 Swing,请在使用时查看 java.swing.Timer. And make sure you're running in the event dispatch thread (EDT):-)。

您要查找的是 'game loop' 模式。 这很好地解释了它...... http://www.java-gaming.org/index.php/topic,24220.0

如果您希望您的游戏具有响应性,您应该将逻辑和图形渲染委托给不同的线程。 运行将所有内容都集中在一个线程中使得此应用程序在计算 Thread.Sleep() 效果方面高度不可预测。

另外请说明您使用的是什么,AWT、Swing、JavaFX?如果您使用 AWT,渲染流畅的动画可能会出现严重问题。我建议从 Swing 开始,即使是非常基础的 games/animations.

关于 运行 个线程,我最喜欢的是:

  1. 正在创建新的 Class 实现 运行nable 私有字段 Thread threadboolean flag
  2. @Override 运行() 有类似的东西 try { while(flag) { refresh(); Thread.sleep(10) } }
  3. 在此 class 中创建一个设置 flag=true 并启动内部线程 thread = new Thread(this).start()
  4. 的方法 startRendering()
  5. 创建设置 flag=false
  6. 的 stopRendering()

这使您可以在逻辑线程中正确、轻松地启动和停止动画(无需 Thread.Abort() 等)