私はいくつかのクラスを持つJavaアプリケーションを作成しました。Javaアプリケーションがコンソールでブロックされています
一つのクラスは、そのメソッドを持つスレッドです:
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
coins = Double.valueOf(input);
maximumPrice = Double.valueOf(scanner.next());
while (!isInterrupted()) {
input = scanner.nextLine();
if ("stop".equals(input) || "sell".equals(input) || "panic".equals(input)) {
System.out.println("here");
commandRelevant = true;
commandValue = input;
interrupt();
}
if (input.contains("override")) {
commandRelevant = true;
if (input.contains("positive")) {
commandValue = "positive";
} else if (input.contains("negative")) {
commandValue = "negative";
} else if (input.contains("activate")) {
commandValue = "activate";
} else if (input.contains("unpredictable")) {
commandValue = "unpredictable";
} else {
commandValue = "neutral";
}
}
if (input.contains("setPrice")) {
commandRelevant = true;
commandValue = input;
}
}
}
私の全体のプログラムは、実際にそのクラスに独立して動作します。
public boolean commandRelevant() {
return commandRelevant;
}
ゲッターを持つ唯一の1つのクラスのアクセスこのスレッドクラスは私の問題がある:私は私のIDEでこのアプリケーションを実行すると
、何もかもが時間正常に動作します。入力なし、何もブロックされません。私が入力を与えると、私のアプリケーションは何をすべきかを行います。
しかし、すぐに私はjarファイルに私のコードを入れて、それをサーバにアップロードし、 Javaバージョン "1.8.0_111" のJava(TM)SEランタイム環境(1.8.0_111-B14を構築) のJavaを実行していますHotSpot(TM)クライアントVM(ビルド25.111-b14、混在モード)
私のアプリケーションは30分と言うことができますし、突然ブロックを開始入力なし。 私がコマンドラインをクリックして、スペースを入力すると、アプリケーションが突然終了します。そして、コマンドラインでもう一度スペースまたは別のキーを押すまで、1秒後に再びブロックします。それはうんざりしたようなものです。
誰かがここで問題が発生する可能性があると考えていますか? これはVMの問題ですか?私はちょうどjava -jar application.jarで自分のプログラムを起動します。
呪われたVMである可能性があります。 @Tomは別のスレッドだけをブロックします。彼は彼のアプリケーション全体(他のスレッド)がブロックされていることを心配しています(そのために私たちはコードを見ません)。 – Kayaman
@Kayamanああ、彼のアプリ全体がスレッドの代わりにブロックされていないことを忘れてしまった。ありがとう。 – Tom
問題がこの特定のコードにあるとは思われません。 VisualVMを使用して、サーバー上の実行中のアプリケーションに接続し、奇妙な動作を開始するときに何が起きているのかを確認できます。他のコード、「ブロックする」と表示されるコードを表示することもできます。 – Kayaman