Java中的线程,状态?还有,正确的使用方法是什么?

Java中的线程,状态?还有,正确的使用方法是什么?,java,multithreading,computer-science,Java,Multithreading,Computer Science,我后天就要参加考试了,所以我需要在考试前搞清楚,希望你们能帮我 首先,我确实知道线程有4种状态(即运行、就绪、阻塞、终止),但是我不太确定它在Java中是如何工作的。在我的代码中,我使用thread.sleep(3000)在程序中进行一些等待,这会使线程阻塞还是准备就绪 我还注意到,我可能没有以正确的方式使用线程,让我向您展示一些代码 public class BattleHandler implements Runnable { private Player player; private

我后天就要参加考试了,所以我需要在考试前搞清楚,希望你们能帮我

首先,我确实知道线程有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);

    }
公共类BattleHandler实现可运行{
私人玩家;
私人怪物敌人怪物;
私人地牢;
私人区域日志;
私人游戏屏幕;
公开募捐{
试一试{
runBattle();
}
catch(异常e){System.out.println(e);}
}
公共战场处理程序(玩家攻击玩家、JTextArea日志、GameScreen gScreen){
this.player=攻击型玩家;
this.log=log;
this.gScreen=gScreen;
}
公共无效地下城(地下城){
this.dungeon=地牢;
}
公共地下城getDungeon(){
返回地牢;
}
公共怪物getEnemyMonster(){
返回敌人怪物;
}
公共空间设置怪物(){
//首先检查地下城是否已经初始化,如果没有,我们无法生成怪物
如果(地牢!=null){
enemyMonster=新怪物();
//生成怪物统计数据
敌人怪物。生成者(地牢);
}否则{
System.out.println(“地牢未初始化”);
}
}
public void runBattle()引发InterruptedException{
//开始战斗,一直跑到一个参赛者死亡。
while(player.getHealth()>0&&enemyMonster.getHealth()>0){
int playerStrikeDmg=player.strike();
if(enemyMonster.blockdefect()){
log.setText(log.getText()+“\n”+player.getName()+”试图攻击“+enemyMonster.getName()+”,但“+enemyMonster.getName()+”被阻止。”);
}else if(enemyMonster.dodgedefect()){
log.setText(log.getText()+“\n”+player.getName()+”试图攻击“+enemyMonster.getName()+”,但“+enemyMonster.getName()+”被阻止。”);
}否则{
敌人怪物。防御(玩家攻城);
log.setText(log.getText()+“\n”+player.getName()+“打击”+enemyMonster.getName()+“针对:“+playerStrikeDmg+”左:“+enemyMonster.getHealth()”);
}
如果(enemyMonster.getHealth()<1)中断;
睡眠(3000);
//怪兽回合
int monsterDmg=enemyMonster.strike();
if(player.blockdefect()){
log.setText(log.getText()+“\n”+enemyMonster.getName()+”试图攻击“+player.getName()+”,但“+player.getName()+”被阻止。”);
}else if(player.dodgedefect()){
log.setText(log.getText()+“\n”+enemyMonster.getName()+”试图攻击“+player.getName()+”,但“+player.getName()+”躲闪了。”);
}否则{
玩家。防守(怪物DMG);
log.setText(log.getText()+“\n”+enemyMonster.getName()+“打击”+player.getName()+“为:“+monsterDmg+”左:“+player.getHealth()”);
}
gScreen.updateBot();
睡眠(3000);
}
当我编写此代码时,我认为它很酷,但我看到一些人创建了一个仅用于控制线程本身的类。我刚刚创建了一个使用Sleep的可运行类(代码中没有显示,但它是一个大类)

把这件事弄清楚会很好,所以我可以在他们问我之前指出,你知道的,拿走弹药

希望你们能帮我:)

Thx线程的数量超过4个。另外,我建议阅读更多关于线程的信息

请注意,如果您希望以设定的时间间隔执行任务,我强烈建议您使用该框架。

线程多于4个。此外,我建议您阅读更多有关线程的信息


请注意,如果您希望以设定的时间间隔执行任务,我强烈建议您使用该框架。

已阻止-在超时之前它根本不会运行。Ready是“现在可运行,但没有可用的处理器”将在处理器可用时立即运行。

已阻止-在超时之前它根本不会运行。Ready Is“现在可以运行,但没有可用的处理器来运行它-一旦处理器可用,它就会运行。”

正如所有其他人所说的,还有更多,下面是一个简单的列表:

  • 跑步-猜猜看,它在跑步
  • 等待-它等待另一个线程完成其计算(这是Java中的wait()方法)。基本上,这样的线程也可以由调度程序运行,就像“就绪”状态的线程一样
  • 就绪-表示线程已准备好执行,一旦OS调度程序转向该线程,它将执行该线程
  • Blocked-表示还有另一个操作,阻止此线程执行,例如IO
  • 终止-猜猜看,它已经完成,将被OS调度程序删除
  • 有关完整列表,请查看著名的维基百科;)

    正如所有其他人所说的,还有更多,这里有一个简单的列表:

  • 跑步-猜猜看,它在跑步
  • 等待-它等待另一个线程完成其计算(这是Java中的wait()方法)。基本上,这样的线程也可以由调度程序运行,就像“就绪”状态的线程一样
  • 就绪-表示线程已准备好执行,一旦OS调度程序转向该线程,它将执行该线程
  • Blocked-表示还有另一个操作,阻止此线程执行,例如IO
  • 终止-猜猜看,它已经完成,将被OS调度程序删除
  • 有关完整列表,请查看著名的维基百科;)

    runBattle()方法的实现在哪里?您的q是什么