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!