Как вы можете запустить два цикла while параллельно?(Джава) - PullRequest
0 голосов
/ 08 июля 2019

Я хочу запустить свою игру немного эффективнее. Я хотел бы использовать два потока вместо одного потока. Теперь я хочу соединить два класса, используя параллельный цикл while для запуска. Но если я начну игру сейчас, второй поток не будет выпущен, пока цикл while не остановится в первом потоке. Это мой код:

public class Game {

     public void Game() {
         Update update;
         Render render;

         update.start();
         render.start();
     }
}

class Update implements Runnable {
    private Thread thread;
    private boolean running;

    @Override
    public void run() {

       while(running) {
          //Update Stuff
       }

    }

    public synchronized void start() {
         if(running)
           return;
         running = true;
         thread = new Thread(this);
         thread.start();
    }
}

class Render implements Runnable {
    private Thread thread;
    private boolean running;

    @Override
    public void run() {

       while(running) {
          //Render Stuff
       }

    }

    public synchronized void start() {
         if(running)
           return;
         running = true;
         thread = new Thread(this);
         thread.start();
    }
}

Как я могу запустить оба потока одновременно? Заранее спасибо.

1 Ответ

0 голосов
/ 08 июля 2019

Примерно так должно работать:

public class Game {
    volatile boolean running = true;
    Thread updateThread;
    Thread renderThread;

    public void Game() {
    }

    public void start() {
        Update update = new Update(this);
        updateThread = new Thread(update);
        updateThread.start();
        Render render = new Render(this);
        renderThread = new Thread(render);
        renderThread.start();
    }

    public void waitForFinish() throws InterruptedException {
        updateThread.join();
        renderThread.join();
    }

    boolean isRunning() {
        return running;
    }
}

class Update implements Runnable {
    private final Game game;

    Update(Game game) {
        this.game = game;
    }

    @Override
    public void run() {

        while (game.isRunning()) {
            try {
                Thread.sleep(1000);
                System.out.println("Update");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

class Render implements Runnable {
    private final Game game;

    Render(Game game) {
        this.game = game;
    }

    @Override
    public void run() {

        while (game.isRunning()) {
            try {
                Thread.sleep(100);
                System.out.println("Render");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

private void test() throws InterruptedException {
    Game game = new Game();
    game.start();
    game.waitForFinish();
}
...