すべて 指定のパッケージ内に作成してください

ソースコード(クラス名.java)をSドライブにアップロードして提出してください

S:\Java\課題提出\基礎\25章


問題1 スレッドの作成 その1

Runnableインターフェースを実装する方法を使用して、スレッドを作成してください。

スレッド内の処理では、1秒おきに現在日時を5回表示してください。(表示形式は自由)

mainメソッドからは、スレッドを1つ実行してください。

クラス、メソッドのアクセスコントロールはすべてpublicとします。

また、例外が発生した場合はスタックトレースを出力するようにコーディングしてください。

パッケージ chapter25.kadai1
スレッドクラス名 TimeDispRunnable
mainメソッドを持つクラス名 TimeDispMain

実行結果サンプル

Tue Jun 28 09:40:51 JST 2022

Tue Jun 28 09:40:52 JST 2022

Tue Jun 28 09:40:53 JST 2022

Tue Jun 28 09:40:54 JST 2022

Tue Jun 28 09:40:55 JST 2022

問題2 スレッドの作成 その2

Threadクラスを継承する方法を使用して、スレッドを作成してください。

スレッド内の処理は、

  1. スレッド名(自動で割り振られる)と「start」をコンソールに表示
  2. 数値を1から1億まで足し合わせる処理を行う
  3. スレッド名と「end」と合計値をコンソールに表示

mainメソッドからは、スレッドを5つ実行してください。

クラス、メソッドのアクセスコントロールはすべてpublicとします。

パッケージ chapter25.kadai2
スレッドクラス名 SumThread
mainメソッドを持つクラス名 SumMain

実行結果サンプル ※順序は同じにならなくて問題ありません。

Thread-0 start

Thread-4 start

Thread-3 start

Thread-1 start

Thread-1 end 合計:5000000050000000

Thread-2 start

Thread-4 end 合計:5000000050000000

Thread-3 end 合計:5000000050000000

Thread-0 end 合計:5000000050000000

Thread-2 end 合計:5000000050000000

問題3 スレッドの同期

以下のプログラムは、それぞれ500行のデータを持つテキストファイルを3つ読み込み、一つのArrayListオブジェクトlistに格納するプログラムです。

一つのテキストファイルごとに1スレッドで読み込みを行っています。

全てのデータを読み込み、listに格納できれば、最終的な件数は1500件になるはずですが、実行するたびにリストに格納されている件数は変わってしまいます。(実行結果最終行の[list.size() = xxxx]部分の数値)

場合によってはExceptionが発生することもあります。

ArrayListクラスのaddメソッドは、内部的に[リストの末尾が何番目かをチェック]→[チェックした位置にデータを格納]という処理を行っていますが、 複数スレッドからアクセスされると、末尾の番号をチェックする処理と、チェックした位置にデータを格納する処理の間に別スレッドの割り込みが入る可能性があるのが原因です。

Exceptionが起きることなく、確実に最終件数が1500件になるように、プログラムに2行だけ追加して修正してください。

読み込むテキストファイルは、以下のリンクからダウンロードし、eclipseのパッケージエクスプローラーでjava_basicプロジェクトにコピーして使用してください。

input1.txt  input2.txt  input3.txt


変更元のプログラム 以下に2行追加して問題を解決すること


package chapter25.kadai3;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileIOMain {
    List<String> list = new ArrayList<>();

    class FileIOThread extends Thread {
        private String fname;

        public FileIOThread(String fname) {
            this.fname = fname;
        }

        public void run() {
            try (BufferedReader reader
             = new BufferedReader(new FileReader(fname))) {
             
                System.out.println
                    (getName() + " "+ fname + " read start");
                    
                while(reader.ready()) {
                    list.add(reader.readLine());
                }
                
                System.out.println(getName() + " read end");
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public Thread callThread(String fName) {
        FileIOThread t = new FileIOThread(fName);
        t.start();
        return t;
    }
    
    public static void main(String[] args) {
        FileIOMain fio = new FileIOMain();

        Thread t1 = fio.callThread("input1.txt");
        Thread t2 = fio.callThread("input2.txt");
        Thread t3 = fio.callThread("input3.txt");
        
        try {
            // Threadクラスのjoin()メソッドは、スレッドの終了を待つ
            t1.join();
            t2.join();
            t3.join();
            
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("list.size() = " + fio.list.size());
    }
}