【问题标题】:Threads in Java, states? Also what is the right way to use them?Java中的线程,状态?还有什么是使用它们的正确方法?
【发布时间】: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


【解决方案1】:

线程有超过 4 个states。另外,我建议阅读Lesson: Concurrency 以了解有关线程的更多信息。

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

【讨论】:

  • 谢谢,很棒的链接!该程序不开放更改,我只需要为我可能犯或可能没有犯的错误做好准备。
【解决方案2】:

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

【讨论】:

  • 您所说的“就绪”可能会被错误地理解。这并不意味着该进程将尝试“获得”空闲处理器。这样的事情是不可能的。这意味着 OS-Scheduler 当前正在另一个进程上进行计算。一旦它决定切换到另一个进程,它可能会根据操作系统策略选择操作系统队列中的“就绪”线程之一。同样“阻塞”并不意味着它会超时。这意味着另一个操作阻止了该线程的执行。一旦结束,它很可能会返回并工作
  • 鉴于 OP 的四个线程状态集,'blocked' 是最接近的:) 释放处理器,(例如,抢占较低优先级的线程以运行刚刚完成的高优先级线程准备好),在操作系统级别当然是可能的。
【解决方案3】:

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

  1. 正在运行 - 你猜怎么着,它正在运行
  2. Waiting - 它等待另一个线程完成其计算(Java 中的 wait() 方法)。基本上这样的线程也可以由调度程序运行,就像“就绪”状态的线程一样。
  3. Ready - 表示线程已准备好执行,一旦OS-Scheduler转向该线程,就会执行它
  4. Blocked - 表示有另一个操作,阻塞了这个线程的执行,比如IO。
  5. 已终止 - 你猜怎么着,它已经完成,将被 OS-Scheduler 删除。

如需完整列表,请查看著名的 Wikipedia ;) http://en.wikipedia.org/wiki/Process_state

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多