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

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

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

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

Q&A

3回答

906閲覧

java言語スレッド処理

keishinitta

総合スコア0

Java

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

0グッド

1クリップ

投稿2021/11/06 00:50

前提・実現したいこと

スレッドを使用したプログラムです。1秒間でエンターキーを押した数を表示するプログラムを作成し実行したのですが、実行すると、下のようなエラー文が出てしまい、かつカウントが1回のみで強制終了してしまいます。どの部分を修正すればうまく実行できるのか、よろしければアドバイスをお願いします。

発生している問題・エラーメッセージ

Enter: Enter: Exception in thread "main" java.lang.IllegalThreadStateException at java.base/java.lang.Thread.start(Thread.java:793) at Sample.main(Sample.java:44) 1

該当のソースコード

Java言語

1 2import java.io.*; 3 4class Counter{ 5 private int count = 0; 6 public synchronized void add(){ 7 try{ 8 9 int temp = count; 10 Thread.sleep(1000); 11 count = temp + 1; 12 } 13 catch(InterruptedException e){ 14 15 } 16 } 17 18 public int getCount(){ 19 return count; 20 } 21} 22 23class Worker extends Thread{ 24 Counter counter = new Counter(); 25 26 public void run(){ 27 counter.add(); 28 System.out.println(counter.getCount()); 29 30 return; 31 } 32 33} 34 35class Sample{ 36 public static void main(String[] args) throws NumberFormatException{ 37 Worker worker = new Worker(); 38 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 39 40 while(true){ 41 System.out.print("Enter: "); 42 try{ 43 if((br.readLine()).equals("")){ 44 worker.start(); 45 } 46 } 47 catch(IOException e){ 48 System.out.println("error"); 49 } 50 } 51 52 } 53}

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

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

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

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

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

guest

回答3

0

スレッドは、1回実行したものは再利用できません。

投稿2021/11/06 02:01

swordone

総合スコア20649

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

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

0

「1秒間でエンターキーを押した数を表示」であれば、別スレッドは 1 秒後に表示する 1 つだけで済むはずです。


上で別スレッドで表示としましたが、分かり難いかもしれませんのでメインスレッドで表示するものにしました。

java

1package teratail_java.q367984; 2 3import java.io.*; 4 5//1秒後に停止する 6class Worker extends Thread { 7 private int count = 0; 8 private boolean end = false; 9 public void run() { 10 try { 11 Thread.sleep(1000); 12 System.out.println("Enter to End."); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 end = true; 17 } 18 void countUp() { if(!end) count ++; } 19 int getCount() { return count; } 20} 21 22class Sample { 23 public static void main(String[] args) { 24 Worker worker = new Worker(); 25 try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));) { 26 System.out.print("Enter to Start."); 27 br.readLine(); 28 29 worker.start(); 30 System.out.println("Hit Enters."); 31 while (worker.isAlive()) { 32 br.readLine(); 33 worker.countUp(); 34 } 35 } catch (IOException ignore) { 36 } 37 System.out.println("count="+worker.getCount()); 38 } 39}

投稿2021/11/06 05:38

編集2021/11/10 05:35
jimbe

総合スコア12545

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

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

keishinitta

2021/11/09 05:07

1秒後に表示する1つだけとはどういうことでしょうか?
jimbe

2021/11/09 10:24

なぜお作りのプログラムでスレッドが必要なのかと言えば、入力と時間計測を同時に行う必要があるからだと思います。 であれば、メインのスレッドと新たに作るスレッドの二つがあれば、一方で入力を処理し、もう一方で時間を計るように担当を分けるだけです。 表示をどちらでするかは単なる選択で、時間を計る方で表示のほうが見た目は分かり易いかも知れないということで、「いや分かり難い」と言われればそうかも知れません。
guest

0

threadクラスは1度終了したら、再度そのオブジェクトを使用することはできません。

なので、RunnableクラスとExecututerServiceクラスを使って、こう書くかな自分なら。
動かしてないので、ご自身で試してください。

import java.io.*; class Counter{ private int count = 0; public synchronized void add(){ try{ int temp = count; Thread.sleep(1000); count = temp + 1; } catch(InterruptedException e){ } } public int getCount(){ return count; } } // ここをthreadクラスからRunnableクラスに変える class Worker implements Runnable { Counter counter = new Counter(); public void run(){ counter.add(); System.out.println(counter.getCount()); return; } } class Sample{ public static void main(String[] args) throws NumberFormatException{ // ExecutorServiceのオブジェクトを生成 ExecutorService exec = Executors.newSingleThreadExecutor(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ System.out.print("Enter: "); try{ if((br.readLine()).equals("")){ // Workerオブジェクトを生成して別スレッドで実行する exec.submit(new Worker()); } } catch(IOException e){ System.out.println("error"); } } } }

投稿2021/11/06 02:18

編集2021/11/06 02:23
rinjinto

総合スコア170

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問