相关疑难解决方法(0)

System.nanoTime()完全没用吗?

Java博客文章Beware of System.nanoTime()中所述,在x86系统上,Java的System.nanoTime()使用CPU特定计数器返回时间值.现在考虑以下用于测量呼叫时间的情况:

long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
Run Code Online (Sandbox Code Playgroud)

现在在多核系统中,可能是在测量time1之后,线程被调度到不同的处理器,其计数器小于先前CPU的计数器.因此,我们可以得到time2中的值,该值小于 time1.因此,我们将在timeSpent中得到负值.

考虑到这种情况,是不是System.nanotime现在几乎没用?

我知道改变系统时间不会影响纳米时间.这不是我上面描述的问题.问题是每个CPU都会在打开后保留不同的计数器.与第一个CPU相比,第二个CPU上的计数器可以更低.由于在获取time1之后OS可以将线程调度到第二个CPU,因此timeSpent的值可能不正确甚至是负数.

java nanotime

151
推荐指数
8
解决办法
11万
查看次数

为什么我的System.nanoTime()坏了?

我和我这个时代的另一位开发人员最近从一台Core 2 Duo机器搬到了新的Core 2 Quad 9505; 两者都使用JDK 1.6.0_18运行Windows XP SP3 32位.

在这样做的时候,我们对一些时序/统计/度量聚合代码的自动单元测试很快就会失败,因为看起来似乎是从System.nanoTime()返回的荒谬值.

在我的机器上可靠地显示此行为的测试代码是:

import static org.junit.Assert.assertThat;

import org.hamcrest.Matchers;
import org.junit.Test;

public class NanoTest {

  @Test
  public void testNanoTime() throws InterruptedException {
    final long sleepMillis = 5000;

    long nanosBefore = System.nanoTime();
    long millisBefore = System.currentTimeMillis();

    Thread.sleep(sleepMillis);

    long nanosTaken = System.nanoTime() - nanosBefore;
    long millisTaken = System.currentTimeMillis() - millisBefore;

    System.out.println("nanosTaken="+nanosTaken);
    System.out.println("millisTaken="+millisTaken);

    // Check it slept within 10% of requested time
    assertThat((double)millisTaken, Matchers.closeTo(sleepMillis, sleepMillis * 0.1));
    assertThat((double)nanosTaken, Matchers.closeTo(sleepMillis * 1000000, sleepMillis * 1000000 …
Run Code Online (Sandbox Code Playgroud)

java timestamp nanotime

11
推荐指数
1
解决办法
5900
查看次数

将游戏部署到服务器会导致奇怪的行为

我和朋友一起使用HTML5 WebSockets和java作为后端开发了类似于游戏的游戏,并且最近将我的游戏部署在运行在20 $ Digitalocean Droplet(3GB ram,2cpu)上的Glassfish服务器上.

在开发游戏时,我使用IntelliJ和Netbeans的同事,在我们的PC上运行的Glassfish服务器上部署WAR文件时,一切都按预期工作.但是当在液滴上部署完全相同的WAR文件时,球的移动速度似乎快了3倍.

我尝试通过在虚拟机上安装与Droplet相同的Ubuntu服务器并执行我用于安装OpenJDK,Glassfish的相同步骤来重现该问题,但是在VM上它也运行良好.

其他具有1个CPU(试过ubuntu和centos)的液滴会产生同样的问题.我想知道这个问题的原因可能是我错过了什么?

下面是我用于连接/游戏的代码:

WebSocket的:

@ServerEndpoint("/singleplayer")
public class SingleplayerSocket {

    private static final Set<Session> PLAYERS = Collections.synchronizedSet(new HashSet<Session>());

    private Session session;
    private Gson gson;
    private Game game;

    private void sendMessage(String message) {
        try {
            for (Session player: PLAYERS) {
                if (player == session) {
                    player.getBasicRemote().sendText(message);
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void gameStart() {
        game.start();
        sendMessage("Game started");
    }

    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        gson = …
Run Code Online (Sandbox Code Playgroud)

java glassfish java-ee websocket java-websocket

6
推荐指数
1
解决办法
181
查看次数