java - 我的 while 循环对于我的方法来说是否太快?

标签 java multithreading loops methods while-loop

我有一个方法chatHandler();,其中包含相当多的代码。它还与程序的其余部分一样在单独的线程上运行。

main 方法中,只要 running == true ,我就有一个 while 循环运行它,如下所示:

while (running) {
  chatHandler();
}

(问题 1)我的问题是,由于我在不同的线程上运行 chatHandler();...该方法的调用速度是否可以比其中的代码运行速度更快?我的程序的结果似乎告诉我是这样的。

对于 Google 来说,这似乎也是一个过于具体的问题,就在你 mock 我之前。因此,如果问题 1 是肯定的,那么如何确保 while 函数的循环速度与 chatHandler(); 的处理速度一样快?

这是我的 chatHandler(); 方法中的代码:

public static void chatHandler() {
  new Thread(new Runnable() {
    public void run() {

      LocalDateTime now = LocalDateTime.now();
      int hour = now.get(ChronoField.HOUR_OF_DAY);
      int minute = now.get(ChronoField.MINUTE_OF_HOUR);
      int second = now.get(ChronoField.SECOND_OF_MINUTE);

      String hourSyntax = Integer.toString(hour);
      String minuteSyntax = Integer.toString(minute);
      String secondSyntax = Integer.toString(second);

      if (hour < 10) {
        hourSyntax = "0" + hourSyntax;
      }

      if (minute < 10) {
        minuteSyntax = "0" + minuteSyntax;
      }

      if (second < 10) {
        secondSyntax = "0" + secondSyntax;
      }

      String chatChecker = "[" + hourSyntax + ":" + minuteSyntax + ":" + secondSyntax +
        "] [Server thread/INFO]: <";
      //System.out.println(chatChecker);
      outputPretext = outputLine.substring(0, 34);

      if (outputPretext.equals(chatChecker)) {
        userNameArray = outputLine.split("~");
        preUserName = userNameArray[1];
        userNameArray2 = preUserName.split(">");
        userName = userNameArray2[0];
        teamCheck = outputLine.substring(34, 36);
        playerMessageArray = outputLine.split(">");
        playerMessage = playerMessageArray[1].substring(1);

        /**
        twitchRank = "§T§r§~";
        youTubeRank = "§Y§r§~";
        owner = "§O§r§~";
        admin = "§A§r§~";
        spookRating1 = "§1§r§~";
        spookRating2 = "§2§r§~";
        member = "§M§r§~";
        */

        //chatCurseReplace();
        //chatSpamCheck();
        //mutedPlayer();

        switch (teamCheck) {

          case "�T":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* \"},{\"text\":\"Twitch \",\"bold\":true,\"color\":\"dark_purple\"},{\"text\":\"" + userName + "\",\"color\":\"blue\"},{\"text\":\" » " + playerMessage + "\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "�Y":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* You\"},{\"text\":\"Tube \",\"bold\":true,\"color\":\"red\"},{\"text\":\"" + userName + "\",\"bold\":true,\"color\":\"blue\"},{\"text\":\" \",\"bold\":true},{\"text\":\" » " + playerMessage + "\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "�O":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* \"},{\"text\":\"Owner \",\"bold\":true,\"color\":\"dark_red\"},{\"text\":\"" + userName + "\",\"color\":\"red\"},{\"text\":\" > " + playerMessage + "\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "�A":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* \"},{\"text\":\"Admin \",\"bold\":true,\"color\":\"dark_red\"},{\"text\":\"" + userName + "\",\"color\":\"red\"},{\"text\":\" » " + playerMessage + "\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "�1":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* \"},{\"text\":\"[\",\"color\":\"dark_green\"},{\"text\":\"S\",\"color\":\"green\"},{\"text\":\"]\",\"color\":\"dark_green\"},{\"text\":\" \"},{\"text\":\"" + userName + "\",\"color\":\"blue\"},{\"text\":\" » " + playerMessage + "\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "�2":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* \"},{\"text\":\"[\",\"color\":\"dark_green\"},{\"text\":\"Spook\",\"color\":\"green\"},{\"text\":\"]\",\"color\":\"dark_green\"},{\"text\":\" \"},{\"text\":\"" + userName + "\",\"color\":\"blue\"},{\"text\":\" » " + playerMessage + "\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "�M":
            try {
              writer.append("/tellraw @a [\"\",{\"text\":\"* \"},{\"text\":\"" + userName + "\",\"color\":\"dark_gray\"},{\"text\":\"  » \"},{\"text\":\"" + playerMessage + "\",\"color\":\"gray\"}]");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;

          case "NO":
            break;

          default:
            try {
              writer.append("say Chat Error: no team");
              writer.newLine();
              writer.flush();
            } catch (IOException e) {
              e.printStackTrace();
            }
            break;
        }
        outputLine = "****************************************************************";
      }
    }
  }).start();
}

就这些了,谢谢!

最佳答案

回答问题 1:是的!哦是的!确实!绝对!

chatHandler() 创建一个新线程并启动它,然后立即返回。

该线程当时几乎没有开始运行(如果有的话)。

然后你的循环返回并再次调用它!

第一个线程甚至到达进入run()方法时,您的循环可能已经开始数十个线程。

如果您的代码遇到线程匮乏问题,我不会感到惊讶。

<小时/>

那么,问自己这个问题:为什么要尝试在不同的线程中运行代码?

如果您只想以代码可以处理的速度运行循环,则直接运行代码即可。

关于java - 我的 while 循环对于我的方法来说是否太快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36951325/

相关文章:

java - 处理 JPA/DAO 实体结果中的非数据库映射字段

java - 仅使用 Primefaces 数据表对 JSF 进行操作审核

multithreading - Scala Stream尾部懒惰和同步

java - ArrayBlockingQueue 包装方法是否需要同步?

python - 如何使用另一个函数终止函数中的 while 循环。 (井字棋游戏)

r - 在 R 中循环查找上一个匹配项

java - 构建项目时的 Maven 配置

java - 无法从 CursorWindow 读取第 384 行,第 47 列。确保正确初始化 Cursor

.net - 在 Invoke() 内部运行时,跨线程操作对表单控件无效 - .NET

c++ - 为什么我的循环没有按我的预期工作?