すべて 指定のパッケージ内に作成してください
ソースコード(クラス名.java)をSドライブにアップロードして提出してください
S:\Java\課題提出\基礎\25章
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
Threadクラスを継承する方法を使用して、スレッドを作成してください。
スレッド内の処理は、
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
以下のプログラムは、それぞれ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());
}
}