質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

387閲覧

何かの処理中にユーザーが何かを入力することで起こる処理を作る方法

cretter

総合スコア91

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/10/06 13:22

編集2020/10/06 13:29

前提・実現したいこと

現在、あるプログラムを実行している途中に何かを押すとそれ専用の処理をするプログラムを作ろうとしています。
例えばtest0101を見てください。

test0101

1public class test0101 2{ 3 public static void main( String[] args ) 4 { 5 var cl = new sample(); 6 cl.random(); 7 System.out.println("終了"); 8 } 9} 10class sample 11{ 12 void random() 13 { 14 while(true){ 15 var r = new java.util.Random(); 16 int i = r.nextInt( 10 ); 17 System.out.print(i); 18 } 19 } 20}

これは延々と乱数が無限に表示されるプログラムです。その後に終了と表示されます。本来class sampleが乱数を無限に表示させてしますので終了は出力されません。Ctrl+Cを押すと処理が強制終了されますが、それだと終了と表示することができません。なのでCtrl+Cを押すと終了が表示されるようにするにはどうすればよいでしょうか。それか、Ctrl+C以外の方法でのやり方を教えてください。
一応自分でも調べてみたのですが、あまり理解できなかったので分かりやすいサイトまたは解説を回答してくれるとありがたいです。

補足情報(FW/ツールのバージョンなど)

java jdk-14.0.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Thread を使えばいいでしょう。

Java

1class test0101 { 2 public static void main(String[] args) throws Exception { 3 var cl = new sample(); 4 Thread t = new Thread() { 5 public void run() { cl.random(); } 6 }; 7 t.start(); 8 System.in.read(); // 入力待ち 9 cl.stop(); 10 t.join(); 11 System.out.println("終了"); 12 } 13} 14 15class sample { 16 volatile boolean running = true; 17 18 void stop() { running = false; } 19 20 void random() { 21 var r = new java.util.Random(); 22 while (running){ 23 System.out.print(r.nextInt(10)); 24 try { Thread.sleep(100); } catch (Exception e) { } 25 } 26 } 27}

Enter を押せば止まります。

追記
BufferedReaderクラスの readyメソッドを使ってみました。

Java

1import java.io.*; // BufferedReader, InputStreamReader 2 3class test0101 { 4 public static void main(String[] args){ 5 var cl = new sample(); 6 cl.random(); 7 System.out.println("終了"); 8 } 9} 10 11class sample { 12 void random() { 13 try (var br = new BufferedReader(new InputStreamReader(System.in))) { 14 var r = new java.util.Random(); 15 while (!br.ready()) { 16 System.out.print(r.nextInt(10)); 17 Thread.sleep(100); 18 } 19 br.readLine(); // Enter の読み飛ばし 20 } catch (Exception e) { e.printStackTrace(); } 21 } 22}

Enter を押せば止まります。

投稿2020/10/06 18:18

編集2020/10/07 09:24
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xebme

2020/10/07 00:47

volatileが必要です。volatile boolean running = true; Javaのメモリモデルとスレッドについて調べてください。
kazuma-s

2020/10/07 03:16

思い通りに動いたので、Java はこれでいいのかと思っていました。 C や C++ では十分注意していたのですが。 ご指摘ありがとうございます。回答を修正しておきます。
guest

0

乱数を求めるループ中に、キー入力されたかどうかをチェックするコードを追加して、押された場合になにか処理するようにすればいいです

投稿2020/10/06 13:26

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cretter

2020/10/06 13:30

>>キー入力されたかどうかをチェックするコードを追加して、押された場合になにか処理するようにすればいいです これの方法を教えてください
kazuma-s

2020/10/07 08:22 編集

y_waiwaiさん、「キー入力されたかどうかをチェックするコード」とは何か具体的に説明してください。 Windows の C/C++ なら kbhit() がありますが、Java ではどうするのでしょうか? もし、ご存じないのならそう言ってください。自分で調べます。
y_waiwai

2020/10/07 08:25

方法論を書いただけで具体的なやり方までは想定してません。 まあ、やるとすれば、OSやBIOSのシステムコールを直接呼んでキー入力をチェックするコードを書く、ぐらいでしょうか。
guest

0

投稿2020/10/06 13:34

編集2020/10/06 13:35
firegrape

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cretter

2020/10/06 14:09 編集

それはjavaですか? 理想はjavaのソースコード内に記述する方法がいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問