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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

2回答

2469閲覧

非同期処理の早押しゲームを作成したいです

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2019/06/08 16:45

編集2019/06/08 20:00

前提・実現したいこと

Enterボタンを押して*を表示してからまたEnterを押すまでの時間を計測したいです。

該当のソースコード

java

1import java.util.Random; 2class RandomTimer extends Thread{ 3 long count; 4 boolean running = true; 5 6 public RandomTimer(long count,boolean runnnig) { 7 //最大待ち時間(ミリ秒)を受け取るコンストラクタを作りたい 8         Random rand = new Random();//0から最大待ち時間までの間のランダムな値をRandomクラスで生成 9 long time = rand.nextInt(10); 10 count = ;/生成した値を初期値として代入; 11 } 12 public void run(){ 13 while(running) { 14 try { 15 Thread.sleep(10); 16 }catch(InterruptedException e) { 17 System.out.println(e); 18 } 19 count = count - 10; 20 if(count < 0) { 21 System.out.println("*"); 22 } 23 } 24 } 25 public long reponseTime() { 26 return -count; 27 } 28 public void stopRunnig() { 29 running = false; 30 } 31} 32class QuickPress{ 33 public static void main(String[] args) { 34 RandomTimer t = new RandomTimer(10, true); 35 System.out.println("Hit enter to start:"); 36//Enterが押されたらRandomTimerインスタンスのスレッド実行を開始し、すぐにまたEnterキーを待つ 37 t.start(); 38 System.out.println("タイム:"//二回目のEnterボタンが押されたらresponseTimeメソッドを読んで値を表示); 39 try { 40 t.join(); 41 }catch(InterruptedException e) { 42 System.out.println(e); 43 } 44 } 45}

試したこと

Enterの処理の仕方などがいまいちよくわかりません.
また実行のイメージは
Hit Enter to start:
*
タイム:300
というような実行結果にしたいです。

教えてほしい部分をコメントアウトしました。わかる方がいれば、教えていただきたいです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2019/06/08 17:50

コードは, 「```java」と「```」の間にある「ソースコード」という文字列に上書きする形で記入してください.
jimbe

2019/06/08 18:16

> Enterボタンを押して*を表示してからまたEnterを押すまでの時間を計測 計測の開始は最初の Enter を押したときでしょうか, それとも * を表示したときでしょうか. > いまいちよくわかりません では, 何がお分かりなのでしょうか. コードに不思議な箇所があります. ``` public RandomTimer() { setCount(count); } ``` これは何をしようとされているのでしょう. ``` int MaxTime = 5; ``` MaxTime は使われておりませんが, 何に使うものでしょう. ``` public void setCount(long count) { this.count = time; } ``` パラメータの count を使用せず, わざわざここで time を count に入れているのはなぜでしょう. ``` for(long count = 11 ;count < 0;count--) { if(count < 0) { System.out.println("*"); } } ``` このループはなぜあるのでしょう. ``` public long responseTime() { return -count; } ``` メソッド名から時間を返すように見えますが, count は何も変わっていないと思います. どういうことでしょうか.
退会済みユーザー

退会済みユーザー

2019/06/08 20:02

わかる範囲でプログラムを改善してみました。コメントアウトしてる部分について教えていただけるとありがたいです。
退会済みユーザー

退会済みユーザー

2019/06/08 20:06

Enterキーボタンの使い方がいまいちわからないのでエンターキーのやり方からプログラムを教えていただけるとありがたいです。
jimbe

2019/06/09 03:43

``` public RandomTimer(long count,boolean runnnig) { //最大待ち時間(ミリ秒)を受け取るコンストラクタを作りたい ``` この count と runnnig は何でしょうか. ``` count = count - 10; ``` なぜ 10 を引いているのでしょう.
guest

回答2

0

nob さんの回答の通り, この場合スレッドを使う必要はありません.

java

1import java.util.*; 2 3public class Quickpress { 4 public static void main(String[] args) throws InterruptedException { 5 Random random = new Random(); 6 long wait = random.nextInt(50) * 100; 7 Scanner scanner = new Scanner(System.in); 8 System.out.println("Hit enter to start:"); 9 scanner.nextLine(); 10 Thread.sleep(wait); 11 System.out.println("*"); 12 long start = System.currentTimeMillis(); 13 scanner.nextLine(); 14 long end = System.currentTimeMillis(); 15 System.out.println("タイム: "+(end-start)+ "[ms]"); 16 } 17}

java

1import java.io.IOException; 2import java.util.Random; 3 4public class Quickpress { 5 public static void main(String[] args) throws IOException, InterruptedException { 6 Random random = new Random(); 7 long wait = (random.nextInt(50)+1) * 100; //100~5000(100刻み) 8 int br = getBr(); 9 System.out.println("Hit enter to start:"); 10 waitTarget(br); 11 Thread.sleep(wait); 12 clearStdIn(); //sleep中に enter されても無視 13 System.out.println("*"); 14 long start = System.currentTimeMillis(); 15 waitTarget(br); 16 long end = System.currentTimeMillis(); 17 System.out.println("タイム: "+(end-start)+ "[ms]"); 18 } 19 //改行コードを取得(Windows は最後のバイト) 20 static int getBr() { 21 String br = System.getProperty("line.separator"); 22 byte[] bytes = br.getBytes(); 23 return bytes[bytes.length-1]; 24 } 25 //標準入力のゴミを削除 26 static void clearStdIn() throws IOException { 27 while(System.in.available() != 0) System.in.read(); 28 } 29 //標準入力から target が入力されるまで待つ 30 static void waitTarget(int target) throws IOException { 31 while(System.in.read() != target); 32 } 33}

別スレッドで非同期処理をということですが, ネタとしては意味が無いように思います.
どちらかからの課題なのでしょうか.

java

1import java.io.IOException; 2import java.util.Random; 3 4class RandomTimer extends Thread { 5 private long wait; 6 private int targetCode; 7 private long reponseTime; 8 RandomTimer(int waitmax, int targetCode) { 9 Random random = new Random(); 10 wait = random.nextInt(waitmax); 11 this.targetCode = targetCode; 12 } 13 public void run() { 14 try { 15 waitTarget(targetCode); 16 Thread.sleep(wait); 17 clearStdIn(); 18 System.out.println("*"); 19 long startTime = System.currentTimeMillis(); 20 waitTarget(targetCode); 21 reponseTime = System.currentTimeMillis() - startTime; 22 } catch (IOException | InterruptedException e) { 23 e.printStackTrace(); 24 } 25 } 26 public long getReponseTime() { 27 return reponseTime; 28 } 29 //標準入力のゴミを削除 30 void clearStdIn() throws IOException { 31 while(System.in.available() != 0) System.in.read(); 32 } 33 //標準入力から targetCode が入力されるまで待つ 34 void waitTarget(int targetCode) throws IOException { 35 while(System.in.read() != targetCode); 36 } 37} 38public class Quickpress { 39 public static void main(String[] args) throws IOException, InterruptedException { 40 int targetCode = getBr(); 41 System.out.println("Hit enter to start:"); 42 RandomTimer randomTimer = new RandomTimer(5000, targetCode); 43 randomTimer.start(); 44 randomTimer.join(); 45 System.out.println("タイム: "+randomTimer.getReponseTime()+ "[ms]"); 46 } 47 //改行コードを取得 48 static int getBr() { 49 String br = System.getProperty("line.separator"); 50 return br.getBytes()[0]; 51 } 52}

投稿2019/06/09 04:26

編集2019/06/09 06:08
jimbe

総合スコア12648

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

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

0

ベストアンサー

ソースを見ても実現しようとしていることがイマイチ理解できなかったので、
外していたら、ゴメンナサイ

Enterの処理は
こんな風
じゃダメですか?
文字を何も入れなくて、Enterだけ入れれば目的は達せられるように思います。
(Enter以外の文字は入力できないようにしないとダメですか?)

プログラムとしては
Enterの入力を待つ
*を出力する
現在時刻を読み取る
Enterの入力を待つ
現在時刻を読み取る
二つの時刻の差を出力
で、ダメですか?

追記:
ひょっとして、やりたいのは時間の計測ではなく、
別スレッドで非同期処理をしたい、のですか?

投稿2019/06/09 03:54

編集2019/06/09 03:57
nob.

総合スコア711

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

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

退会済みユーザー

退会済みユーザー

2019/06/09 05:01

そうです、別スレッドと非同期処理を行いたいです。
nob.

2019/06/09 06:41

でしたら、そのような質問内容にして下さい。 今のままでは「Enterの処理」についての質問のように読めます。 「非同期処理のXXXを実現しようとしているが、YYYYがZZZZの理由でうまく行かない」 のようにして、再質問をされるのがいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問