2016-04-30 5 views
1

かなりのコードを含むchatHandler();というメソッドがあります。また、プログラムの残りの部分とは別のスレッドでも実行されます。私はこのように長いので、同様running == trueとして実行されているwhileループ持つmain方法で私のwhileループは私の方法にとっては速すぎるループですか?

while (running) { 
    chatHandler(); 
} 

(質問1)私の質問は、以来、私は別のスレッドでchatHandler();を実行しているということですが...メソッドが実行できるコードよりも速く呼び出すことができますか?私のプログラムの結果は、これが事実であると私に伝えているようです。

これはまた、Googleにとってはあまりにも具体的なようです。ちょうどあなたが私をローストする前です。だからQuestion 1がyesなら、chatHandler();が処理できるように、while関数がただちにループすることを確認するにはどうすればよいですか?

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(); 
} 

、およそすべてのおかげだ:ここで

は私chatHandler();メソッドのコードです!

+0

もっと説明するためにはもっと文脈が必要です。あなたのコードに基づいて、これを行うためのよりよい方法は、毎回新しいスレッドを開始するのではなく、バックグラウンドでスレッドを常に実行することです(チャットメッセージを処理するため)...もう一度コンテキストから外してください。) – user2494817

+0

なぜ最初にスレッドを使用していますか? (また、特定の同期プリミティブを追加しない限り、コードの実行順序は保証されません) –

+0

何千ものスレッドを起動するように見えます。 'chatHandler()'を呼び出すたびに、新しいスレッドが起動され、すぐに戻ります。スレッドディスパッチャーに非常に多くのスレッドを同時に実行しようとすると頭痛を与えることは言うまでもありません。 –

答えて

2

質問1への回答:はい!ああそう!絶対に!絶対に!

chatHandler()新しいスレッドを作成して起動し、すぐに戻ります。

スレッドは、まったくその時点で実行し始めていません。

ループが回って再び呼び出されます。

最初スレッドもrun()方法を入力の点に得た時点で、あなたのループは、スレッドの数十をキックオフしている場合があります。

あなたのコードがスレッド不足に遭遇した場合、私は驚くことはありません。


あなたはなぜこのコードを別のスレッドで実行しようとしましたか?

コードを処理できるだけ速くループを実行したい場合は、コードを直接実行してください。

+0

私は他のメソッドを実行しているので、そのメソッドの新しいスレッドを作成しました。これは、thread.sleepなどです。メソッドが(それを直接コーディングしなくても)できるだけ高速にループする方法はありますか?メソッドの最後にブール値を設定するのと同じですか? – Kaelinator

+0

これは修正されました。私は今、 'chatHandler();'を呼び出し、そのスレッド内でwhileループを実行します。ありがとう! – Kaelinator

-1

あなた自身で記述しない限り、並行コードの実行順序は保証されていません。この場合は、何千ものスレッドを生成する可能性が最も高いですが、タイミングに依存します。

このケースでは、並行プログラミング機能を悪用しているように見えます。

一部の比較的まれなケースでは、パフォーマンスが向上する可能性があるため、並行コードが存在します。 ハックです。

質問1に答えてください:はいです。

質問2に答えるには、スレッドが完了するまで待つか、単にスレッドの使用を止めることができます。必要のない機能を使用する代わりに、関数を呼び出すだけです。これは、スレッドの目的は一度に複数のことを行うことですが、新しいスレッドを作成する前に各スレッドが完了するまで待ってから、全体のポイントを破ります。

+2

私はマルチスレッドがまれであるとか、ハックだとは言いません。それは非常に一般的で絶対に必要です。 – Andreas

+0

@Andreasマルチスレッドは大部分の問題には適していません。あなたが作業していることに依存します。 90%のケース(OPのような)では、コードを順番に実行するほうがよい。私は同時実行性をハックと呼んでいるのは、プログラムのパフォーマンスを向上させるためだけであるからです。それは、(時には信じられないほどの)パフォーマンス上の利益のためだけに複雑さを増しますが、他の理由で使用すべきではありません。 –

0

あなたは別のスレッドでchathandler()を実行していません。別のスレッドで実行しているのは、匿名のRunnableサブクラスのrun()メソッドです。 chathandler()メソッド自体がメインスレッドで実行されています。

あなたがchathandler()を呼び出すたびに、匿名のRunnableサブクラスの新しいインスタンスが作成され、それが起動してから戻ります。これは、Runnableのrun()メソッドの実行速度に関係なく、メインスレッドがループできるように高速に実行されます。その結果、Runnableのコピーが多数生成され、それぞれRun()メソッドが独自のスレッドで実行されます。

あなたが期待しているものに基づいて、複数のスレッドを必要としないようです。ちょうどchathandler()メソッドで間接的に呼び出すのではなく、あなたのメインスレッドからRunnableのrun()メソッドを直接呼び出してください。

関連する問題