如何在不延迟java中的整个程序的同时在单个方法中延迟?

时间:2017-04-13 02:41:09

标签: java thread-sleep pause delayed-execution

我正在java中编写一个描绘一系列矩形的蛇程序。我不明白如何按顺序延迟块的方向更改,以便蛇形矩形在箭头键被击中的同一位置改变方向。我需要在一个方法中等待,而程序的其余部分继续运行。当按下箭头键时,它会触发此方法来改变矩形的方向(u表示向上,d表示向下...)

`public void changeDirection(String dir)
{
    for(int i = 0; i<snakearray.size(); i++)
    {
     //checks to make sure youre not changing straight from l to r or u to d
        if(dir.equals("r")||dir.equals("l"))
        {
            if(//direction of currect element is up or down)
            //makes the current element of the array change to the new direction
            {snakearray.set(i, snakearray.get(i).newDirection(dir));}
        }
        else if(dir.equals("u")||dir.equals("d"))
        {
            if(//current element's direction is right or left)
            {snakearray.set(i, snakearray.get(i).newDirection(dir));}
        }
        //pause method but not game method needed here????
    }
}`

有没有办法实现我需要的暂停?我已经尝试过thread.sleep(20)方法,但是暂停了整个程序......

2 个答案:

答案 0 :(得分:1)

忘记仅为一个简单方法创建新线程。你想要一个例如每秒执行一次的定时,你应该改变你移动蛇的方式。

首先是时间:

swing.Timer:https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html 它非常易于使用,并且具有很多功能。

或者您可以通过测量自上次移动以来的时间来实现非常基本的时间。

您需要lastTimenow个变量。

now = currentTime();
if(now - lastTime > delay){
    moveSnakeParts();
    lastTime = currentTime();
}

其次你不想延迟蛇的部分。蛇有一个你可以控制的头部和一个身体部位列表。所有你需要做的就是移动头部存放其先前的位置,将第一个身体部位移动到前一个位置并存储第一个身体部位以前的位置等等......我希望你能得到它。

答案 1 :(得分:0)

您可以使用所谓的ScheduledExecutorService。这将允许您在给定延迟的单独线程中执行代码。

示例:

  @Test
  public void test() throws ExecutionException, InterruptedException {
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    ScheduledFuture<?> future = service.schedule(() -> changeDirection("r"), 2, TimeUnit.SECONDS);

    // Just for the test to wait until the direction change has been executed
    // In your code you would not need this if you want your program to continue
    future.get();
  }

  private void changeDirection(String dir) {
    System.out.println("Changing direction to " + dir);
    // Your code
  }

说明:

上面的代码以2秒的延迟执行您的方法。此处称为future的返回值可用于跟踪执行何时完成。如果您使用它,您的程序将等到执行完成 由于您不希望主程序等待,只需忽略/不使用调用future.get(),您的主代码将继续执行而不会延迟,只会延迟计划的方法。