让线程休眠的更好方法 [英] Better way to make a thread sleep

查看:56
本文介绍了让线程休眠的更好方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在做一个关于 Java 8 中 2D 图形的教程,当时 NetBeans 提示我执行 Thread.Sleep 会影响性能.然而,尽管我已经找到了几种更好的方法,但我一直无法找到一种方法来包含它们而不会使代码混乱.

I've been doing a tutorial on 2D graphics in Java 8, when NetBeans gave me a hint that doing Thread.Sleep would affect performance. However, though I've been able to find several better ways, I haven't been able to find a way to include them without messing you the code.

package platformer;

import java.awt.*;
import javax.swing.*;
import java.util.Scanner;

@SuppressWarnings("serial")
public class Platformer extends JPanel {
    int x = 0;//Sets the starting coords. of the ball
    int y = 0;
    private void moveBall() {//How much the ball moves by
        x = x+1;
        y = y+1;
    }
    @Override
      public void paint(Graphics g) {//Essentially al the graphics functions
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillOval(x, y, 30, 30);
    }

    public static void main(String[] args) throws InterruptedException {
        Scanner reader = new Scanner(System.in);
        Scanner reader1 = new Scanner(System.in);
        System.out.print("Enter an x-value for the window (whole numbers only): ");
        int setx = reader.nextInt();
        System.out.print("Enter a y-value for the window (whole numbers only): ");
        int sety = reader.nextInt();

        JFrame gameFrame = new JFrame("Sample Frame");//Makes the window variable w/ the name in quotations.
        Platformer game = new Platformer();//'Copies' the graphics functions above into a variable
        gameFrame.add(game);//Adds the above variable into th window
        gameFrame.setSize(setx,sety);//Sets the resolution/size of the window(x,y)
        gameFrame.setVisible(true);//Makse the window visible
        gameFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//Makes the window close when the close button is hit

        while (true){
            game.moveBall();
            game.repaint();
            Thread.sleep(10);
        }
    }    
}

我想知道如何包含一种更好的方法来让线程在循环中休眠,或者让 NetBeans 只执行循环.

I'm wondering how I can include a better way to make the thread sleep in a loop, or otherwise make NetBeans just do the loop.

推荐答案

代替在 while(true) 中使用 Thread.sleep(10),您可以使用ScheduledExecutorService 每 10 秒调用 moveBall()paint() 如下所示,这提供了更清晰的方法,如下所示:

Instead of using Thread.sleep(10) in a while(true), you can use ScheduledExecutorService to invoke moveBall() and paint() for every 10 seconds as shown below which gives much cleaner way as shown below:

public class Platformer extends JPanel implements Runnable {

    int x = 0;//Sets the starting coords. of the ball
    int y = 0;

    public void add() {
            JFrame gameFrame = new JFrame("Sample Frame");//Makes the window variable w/ the name in quotations.
        Platformer game = new Platformer();//'Copies' the graphics functions above into a variable
        gameFrame.add(game);//Adds the above variable into th window
        gameFrame.setSize(setx,sety);//Sets the resolution/size of the window(x,y)
        gameFrame.setVisible(true);//Makse the window visible
        gameFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//Makes the window close when the close button is hit
    }

      private void moveBall() {//How much the ball moves by
        x = x+1;
        y = y+1;
     }


     @Override
      public void paint(Graphics g) {//Essentially al the graphics functions
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillOval(x, y, 30, 30);
    }


     @Override
     public void run() {
        //this code will be executed for every 10 seconds
        moveBall();
        paint();
     }


    public static void main(String[] args) throws InterruptedException {
        Scanner reader = new Scanner(System.in);
        Scanner reader1 = new Scanner(System.in);
        System.out.print("Enter an x-value for the window (whole numbers only): ");
        int setx = reader.nextInt();
        System.out.print("Enter a y-value for the window (whole numbers only): ");
        int sety = reader.nextInt();

        JFrame gameFrame = new JFrame("Sample Frame");//Makes the window variable w/ the name in quotations.
        Platformer game = new Platformer();//'Copies' the graphics functions above into a variable
        gameFrame.add(game);//Adds the above variable into th window
        gameFrame.setSize(setx,sety);//Sets the resolution/size of the window(x,y)
        gameFrame.setVisible(true);//Makse the window visible
        gameFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//Makes the window close when the close button is hit

        //schedule it to run for every 10 seconds
        //this calls the run() method above
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(game, 0, 10, TimeUnit.SECONDS);

    }    
}

这篇关于让线程休眠的更好方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆