Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程环境,带有计时器、单线程执行器和块。非期望输出_Java_Multithreading_Synchronization_Timertask_Scheduledexecutorservice - Fatal编程技术网

Java多线程环境,带有计时器、单线程执行器和块。非期望输出

Java多线程环境,带有计时器、单线程执行器和块。非期望输出,java,multithreading,synchronization,timertask,scheduledexecutorservice,Java,Multithreading,Synchronization,Timertask,Scheduledexecutorservice,这是服务类运行方法 public static void main(String[] args) throws Exception { ... Runnable blackjackThread = BLACKJACK; ScheduledExecutorService blackjackThreadService = Executors.newSingleThreadScheduledExecutor(); blackjackThreadServi

这是服务类运行方法

public static void main(String[] args) throws Exception {
...
        Runnable blackjackThread = BLACKJACK;
        ScheduledExecutorService blackjackThreadService = Executors.newSingleThreadScheduledExecutor();
        blackjackThreadService.scheduleAtFixedRate(blackjackThread, 10, 30, TimeUnit.SECONDS);
...
}
最后是计时器任务

private TimerTask initialWaitToJoinGameTask;
private int counter = 0;
private Timer timer;
private Message message = new Message();
protected AtomicBoolean startGame = new AtomicBoolean();
protected AtomicBoolean waitToStartRound = new AtomicBoolean();
protected int duration = 10;

public synchronized void run() {
        doRoundTimer(duration);
        waitToStartRound.set(true);
        Deck deck = new Deck();
        deck.shuffleDeck();

        message.globalMessage("GAMBLE", "A new game of " + AnsiTable.getCode("yellow") + "Blackjack " + AnsiTable.getCode("white") + "is starting!! #ursa BLACKJACK");
        timer.scheduleAtFixedRate(initialWaitToJoinGameTask, 30, 1000);

        while (!waitToStartRound.get()) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
            for (User u : inRoom) {
                inRoom.remove(u);
                inGame.add(u);
                inGamePlayers.add(new Player(u));
            }
        }

        do {
            message.gameMessage(inRoom, "This round of " + AnsiTable.getCode("yellow") + "Blackjack " + AnsiTable.getCode("white") + "has begun.");

            for (Player p : inGamePlayers) {
                p.addCardToHand(deck.nextCard());
                message.gameMessage(inGame, p.user.getLoginName() + " recieved " + p.lastCardGiven().getCardValue() + " of " + p.lastCardGiven().getSuit());
            }

            for (Player p : inGamePlayers) {
                p.addCardToHand(deck.nextCard());
                message.gameMessage(inGame, p.user.getLoginName() + " recieved " + p.lastCardGiven().getCardValue() + " of " + p.lastCardGiven().getSuit());
            }

            startGame.set(false);
        } while (startGame.get());

        for (User u : inGame) {
            inGame.remove();
            inRoom.add(u);
        }

        for (Player p : inGamePlayers) {
            inGamePlayers.remove(p);
        }

        message.gameMessage(inRoom, "Another round of " + AnsiTable.getCode("yellow") + "Blackjack " + AnsiTable.getCode("white") + "will begin shortly!");
    }
}
因此,应该发生的是单线程服务启动,启动一个受保护的块计数器,该计数器由持续时间为秒的计时器任务递增。之后,它应该给每个玩家发2张牌,然后退出StartName循环。在此之后,它应该按照固定的速率终止当前线程,等待30秒,然后重新启动另一个线程

然而,正在发生的是

public synchronized void doRoundTimer(int dur) {
    initialWaitToJoinGameTask = new TimerTask() {
        @Override
        public synchronized void run() {
            counter++;
            if (counter >= dur) {
                counter = 0;
                timer.cancel();
                waitToStartRound.set(false);
                startGame.set(true);
                notifyAll();
            }
        }
    };
    timer = new Timer("WaitTimer");
}
07:28 PM>新的21点游戏开始了#大熊二十一点
07:28 PM>本轮21点已开始。
07:28 PM>另一轮21点游戏即将开始!
07:29 PM>新的21点游戏开始了#大熊二十一点
07:29 PM>本轮21点已开始。
07:29 PM>另一轮21点游戏即将开始!

在线程开始和游戏开始之间没有实际的卡牌交易,也没有持续的等待时间。

请稍候。您同时使用
ScheduledExecutorService
TimerTask
s。你为什么两者都混在一起?然后你把定时器加入混音中?uh该服务启动一个线程,该线程启动一个计时器线程,用于为游戏创建30秒的“加入”时间段。需要说明的是,计时器任务与计时器关联,计时器由服务中的单个重复线程启动。抱歉,我仍然不明白。你到底想要实现什么?这里的情况是什么?请跳过您认为的解决方案,并解释您想要实现的目标(注意:编辑您的问题以解释场景)最终目标是在我的多线程聊天服务器中进行多人21点游戏。结构将是-游戏开始,30秒等待人们加入,玩游戏(每个人轮到的等待时间),然后游戏在延迟后重新启动。等等,等等。游戏“重新开始”。21点游戏应该一直玩到结束状态,对吗?如果还没有达到最终状态呢?等等。您同时使用
ScheduledExecutorService
TimerTask
s。你为什么两者都混在一起?然后你把定时器加入混音中?uh该服务启动一个线程,该线程启动一个计时器线程,用于为游戏创建30秒的“加入”时间段。需要说明的是,计时器任务与计时器关联,计时器由服务中的单个重复线程启动。抱歉,我仍然不明白。你到底想要实现什么?这里的情况是什么?请跳过您认为的解决方案,并解释您想要实现的目标(注意:编辑您的问题以解释场景)最终目标是在我的多线程聊天服务器中进行多人21点游戏。结构将是-游戏开始,30秒等待人们加入,玩游戏(每个人轮到的等待时间),然后游戏在延迟后重新启动。等等,等等。游戏“重新开始”。21点游戏应该一直玩到结束状态,对吗?如果还没有达到最终状态呢?
07:28 PM << Gamble >> A new game of Blackjack is starting!! #ursa BLACKJACK
07:28 PM << Gamble >> This round of Blackjack has begun.
07:28 PM << Gamble >> Another round of Blackjack will begin shortly!
07:29 PM << Gamble >> A new game of Blackjack is starting!! #ursa BLACKJACK
07:29 PM << Gamble >> This round of Blackjack has begun.
07:29 PM << Gamble >> Another round of Blackjack will begin shortly!