【发布时间】:2012-01-16 11:54:59
【问题描述】:
我后天准备参加我的考试演示,所以我需要在它之前得到一些直接的东西,我希望你们能帮助我。
首先我知道线程有 4 种状态(即运行、就绪、阻塞、终止),但是我不太确定它在 Java 中是如何工作的。在我的代码中,我使用 thread.sleep(3000) 在程序中做一些等待,这会使线程阻塞还是就绪?
我还注意到我可能没有正确使用线程,让我给你看一些代码
public class BattleHandler implements Runnable {
private Player player;
private Monster enemyMonster;
private Dungeon dungeon;
private JTextArea log;
private GameScreen gScreen;
public void run() {
try {
runBattle();
}
catch(Exception e) { System.out.println(e);}
}
public BattleHandler(Player AttackingPlayer, JTextArea log, GameScreen gScreen) {
this.player = AttackingPlayer;
this.log = log;
this.gScreen = gScreen;
}
public void setDungeon(Dungeon dungeon) {
this.dungeon = dungeon;
}
public Dungeon getDungeon() {
return dungeon;
}
public Monster getEnemyMonster() {
return enemyMonster;
}
public void setMonster() {
// First check if dungeon have been init, if not we can't generate the mob
if(dungeon != null) {
enemyMonster = new Monster();
// Generate monster stats
enemyMonster.generateStats(dungeon);
}else {
System.out.println("Dungeon was not initialized");
}
}
public void runBattle() throws InterruptedException {
// Start battle, and run until a contester is dead.
while(player.getHealth() > 0 && enemyMonster.getHealth() > 0) {
int playerStrikeDmg = player.strike();
if(enemyMonster.blockDefend()) {
log.setText( log.getText() + "\n" + player.getName() +" tried to strike " + enemyMonster.getName()+ ", but " + enemyMonster.getName() + " Blocked.");
}else if(enemyMonster.dodgeDefend()) {
log.setText( log.getText() + "\n" + player.getName() +" tried to strike " + enemyMonster.getName()+ ", but " + enemyMonster.getName() + " Blocked.");
}else {
enemyMonster.defend(playerStrikeDmg);
log.setText( log.getText() + "\n" + player.getName() +" strikes " + enemyMonster.getName()+ " for: " + playerStrikeDmg + " left: "+ enemyMonster.getHealth());
}
if(enemyMonster.getHealth() < 1) break;
Thread.sleep(3000);
// Monster Turn
int monsterDmg = enemyMonster.strike();
if(player.blockDefend()) {
log.setText( log.getText() + "\n" + enemyMonster.getName() +" tried to strike " + player.getName()+ ", but " + player.getName()+ " Blocked.");
}else if(player.dodgeDefend()) {
log.setText( log.getText() + "\n" + enemyMonster.getName() +" tried to strike " + player.getName()+ ", but " + player.getName()+ " Dodged.");
}else {
player.defend(monsterDmg);
log.setText( log.getText() + "\n" + enemyMonster.getName() +" strikes " + player.getName()+ " for: " + monsterDmg + " left: "+ player.getHealth());
}
gScreen.updateBot();
Thread.sleep(3000);
}
当我编写此代码时,我认为它很酷,但我看到有些人创建了一个仅用于控制线程本身的类。我刚刚使使用 Sleep 的类可运行(代码中没有显示,但它是一个大类)。
把这件事弄清楚会很好,所以我可以在他们问我之前指出我,你知道带走那里的弹药。 :D
希望你们能帮助我:)。
谢谢
【问题讨论】:
-
runBattle()方法的实现在哪里?你的问题到底是什么?现在还不清楚你期望什么样的答案。从这么小的一段代码中,无法判断您是否以“正确”的方式使用线程。 -
我已经添加了runbattle,我很抱歉。
标签: java multithreading computer-science