多线程 - 只有在所有线程都启动后才能让线程开始执行run()

时间:2017-11-20 19:34:25

标签: java

我目前正在学习Java中的多线程并尝试编写我的第一个多线程游戏。我的游戏中的线程是使用类Game中的函数的玩家,同时使用类Cars中的函数来更改Cars中的数据。我注意到我的线程不是同时开始的; Thread-1已经改变了数据,而Thread-2还没有开始。

Go player0
Go player1
Go player2
196 // player0 changed data in Cars
Go player3
196 // player1 changed data in Cars

我在Game class

中的方法中创建线程
public void createPlayers() throws Exception{
            for(int i = 0; i < num; ++i){
                Player p = new  Player(i);
                p.start();
                System.out.println("Go "+p.name);
            }
        }

起初我认为这是同步问题,因为我的线程使用来自synchronised类的Game方法,该方法使用类synchronised中的Cars方法。

//function from Game
`public synchronized void changeTire(){
                int rnd = new Random().nextInt(hand.length());
                int rnd2 = new Random().nextInt(tires.length);
                discard(hand.get(rnd),lasttire); // function from Car
                this.lastBag = rnd2;


            }

但删除 - 更改同步方法并没有解决问题。我能以某种方式在run()方法中修复它吗?

班级选手:

public class Player extends Thread {
    volatile int n;
    String name;
    PrintWriter b;
    int lasttire;
    AtomicIntegerArray hand;

    public Player(int a) throws IOException {
        n = a;
        this.name = "player"+n;
        Thread.currentThread().setName(this.name);
        String file = "player"+n+"_output.txt";
        b = new PrintWriter(file,"UTF-8");
    }
    public void run(){
        if (gameOn) {
            takeHand();
            while (sum() != 100 && !isInterrupted()) {
                changeTire();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException b) {
                    System.out.println("We have a winner!");
                }
            }
            System.out.println("to");
            StopGame();

        }else{
            b.close();
        }


    }

1 个答案:

答案 0 :(得分:0)

尝试检查是否存在威胁,if(thread.isAlive()){}