我的while循环是否对我的方法来说太快了?

时间:2016-04-30 05:53:48

标签: java multithreading loops methods while-loop

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

main方法中,我有一个while循环运行它,只要像这样running == true

while (running) {
  chatHandler();
}

(问题1)我的问题是,因为我在另一个线程上运行chatHandler(); ...该方法的调用速度是否可以超过其中的代码运行?我的计划的结果似乎告诉我情况就是这样。

对于谷歌而言,这似乎也是一个问题,只是......在你烤我之前。因此,如果问题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();
}

关于所有人,谢谢!

3 个答案:

答案 0 :(得分:2)

回答问题1:是的!哦,是的!非也!当然可以!

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

线程几乎没有(如果有的话)在那个时候开始运行。

然后你的循环转身再次调用它!

第一个线程甚至已经到达进入 run()方法时,你的循环可能已经启动了几十个线程。< / p>

如果您的代码遇到线程饥饿,我不会感到惊讶。

所以,问问自己这个问题:你为什么试着在不同的线程中运行代码?

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

答案 1 :(得分:0)

您没有在另一个线程上运行chathandler()。您在另一个线程上运行的是匿名Runnable子类的run()方法。 chahanndler()方法本身在你的主线程中运行。

每次调用chathandler()时,它都会创建一个匿名Runnable子类的新实例并启动它,然后返回。无论Runnable的run()方法运行速度有多快,这都会发生,因为主线程可以循环。这会产生很多Runnable的副本,每个副本都在自己的线程中运行run()方法。

根据您的预期,您似乎不需要多个线程。只需直接从主线程调用Runnable的run()方法,而不是通过chathandler()方法间接调用它。

答案 2 :(得分:-1)

除非您自己编写并发代码,否则无法保证并发代码的运行顺序。在这种情况下,你最有可能产生数千个线程,但它依赖于时间。

在我看来,在这种情况下,您正在滥用并发编程工具。

并发代码的存在只是因为在一些相对罕见的情况下它可以提高性能。 这是一个黑客。

所以回答问题1:

回答问题2:你可以等待线程运行完成,或者你可以简单地停止使用线程。只需调用该函数,而不是尝试使用您不需要的功能。这是因为线程的目标是同时执行多个操作,但是在生成新线程之前等待每个线程运行完成会使整个点失效。