Javaのサンプルコードです。Java(1.文法)も参照のこと。
書籍Java言語プログラミングレッスン 第3版(上) Java言語を始めようとJava言語プログラミングレッスン 第3版(下) オブジェクト指向を始めようを参考にさせていただきました。
結城浩さんの書籍Java言語プログラミングレッスン 第3版(上) Java言語を始めようの中の「九九の問題出題プログラム」を読んでいて、「問題の解答を入力した時に10秒以上経っていたら時間切れにする機能」があったら面白そうだと思い、BufferedReaderを継承したWaitingReaderを作ってみました。継承・マルチスレッド・割り込み・例外など、さまざまなJavaの機能を使ったため、Javaの勉強になりました。
/** * 結城浩氏の Kuku に時間切れ機能を実装。 * 使用する場合は BufferedReader の代わりに WaitingReader を使用し、 * readLine() ではなく waitingReadLine() メソッドを使用し、 * 時間切れになった場合を想定して例外 InterruptedException を捕捉すること。 * * @author Assy * @copyright 2021 by Assy. */ import java.io.*; public class WaitingReader extends BufferedReader { private boolean rfin = false; public WaitingReader(Reader in){ super(in); } private class WaitingThread implements Runnable { @Override public void run() { rfin = false; try { Thread.sleep(10000); rfin = true; } catch (InterruptedException e) { } } } public String waitingReadLine() throws InterruptedException, IOException { Thread th = new Thread(new WaitingThread()); th.start(); String rslt = readLine(); th.interrupt(); if (rfin == true) { throw new InterruptedException(); } return rslt; } }
注意点として、これだけでは動作しません。結城浩さんの書籍に書かれている九九の問題出題プログラムKuku.javaが必要であり、コメントにも書いてあるように、Kuku.javaの中のshowQuestion()メソッド(問題を表示するメソッド)の中で、BufferedReaderを使う部分をWaitingReaderを使うように直し、readLine()メソッドではなくwaitingReadLine()メソッドを使うように直し、try - catchブロックでInterruptedExceptionを捕捉してたとえば「時間切れです」と表示するように追記しなければいけません。また、ファイル名とクラス名のKukuはKukuTimeOverのような適切な名前に変更してください。
このプログラムのポイントは、ThreadとRunnableインターフェースを用いて、マルチスレッドでタイマー処理をしていること、interrupt()メソッドを使って10秒でスレッドを中断するようにしていること、Thread.sleep(10000)で10秒待って、10秒がもし本当に経てばメンバ変数rfinをfalseからtrueに変更していること、readLine()とinterrupt()が終わった段階でrfinがtrueだったら(もし10秒経っていたら)例外InterruptedExceptionを投げて、それをthrowsで呼び出し元に捕捉させるようにしていることです。
以下はJavaで僕が書いたFizzBuzz。
public class FizzBuzz { public static void main(String[] args) { for (int i = 1; i <= 100; i++){ if (i % 15 == 0) { System.out.print("FizzBuzz, "); } else if (i % 3 == 0) { System.out.print("Fizz, "); } else if (i % 5 == 0) { System.out.print("Buzz, "); } else { System.out.print(i + ", "); } } System.out.println("終了."); } }
実行結果:
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz, 31, 32, Fizz, 34, Buzz, Fizz, 37, 38, Fizz, Buzz, 41, Fizz, 43, 44, FizzBuzz, 46, 47, Fizz, 49, Buzz, Fizz, 52, 53, Fizz, Buzz, 56, Fizz, 58, 59, FizzBuzz, 61, 62, Fizz, 64, Buzz, Fizz, 67, 68, Fizz, Buzz, 71, Fizz, 73, 74, FizzBuzz, 76, 77, Fizz, 79, Buzz, Fizz, 82, 83, Fizz, Buzz, 86, Fizz, 88, 89, FizzBuzz, 91, 92, Fizz, 94, Buzz, Fizz, 97, 98, Fizz, Buzz, 終了.
FizzBuzzの詳細についてはC言語サンプルコードを参照のこと。
2023.05.17
サンプルコード集