解答例 - 実習課題1 - 5.スレッドの同期
(実習課題1)
以下のコンソールプログラムを作成しなさい。
- ファイルをコピーするプログラム。ファイル内容を一旦プログラムに全て読み込んでから、書き込みを行うようにする事。
- 3つのスレッドに分けること。
- 進行状況を表示するスレッド
- ファイルの内容を読み込むスレッド
- ファイルの内容を書き出すスレッド
解答例
/** * FileCopyExample.java * TECHSCORE Java マルチスレッドプログラミング5章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.thread.chapter5.exercise1; public class FileCopyExample implements Runnable { public static void main(String[] args) { FileCopyExample manager = new FileCopyExample(); Thread managerThread = new Thread(manager); managerThread.start(); } public void run() { System.out.println("ファイルをコピーします"); ReadImp reader = new ReadImp(); WriteImp writer = new WriteImp(); Thread readerThread = new Thread(reader); Thread writerThread = new Thread(writer); readerThread.start(); try { System.out.println("読み込み開始"); readerThread.join(); System.out.println("読み込み完了"); } catch (InterruptedException e) { e.printStackTrace(); } //読み込んだデータを渡す writer.setText(reader.getText()); writerThread.start(); try { System.out.println("書き込み開始"); readerThread.join(); System.out.println("書き込み完了"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ファイルをコピーしました"); } }
/** * ReadImp.java * TECHSCORE Java マルチスレッドプログラミング5章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.thread.chapter5.exercise1; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReadImp implements Runnable { private String text = null; public void run() { try { BufferedReader reader = new BufferedReader(new FileReader("input.txt")); String line; StringBuffer tmp = new StringBuffer(); while ((line = reader.readLine()) != null) { tmp.append(line); } reader.close(); text = tmp.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public String getText() { return text; } }
/** * WriteImp.java * TECHSCORE Java マルチスレッドプログラミング5章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.thread.chapter5.exercise1; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class WriteImp implements Runnable { private String text = null; public void run() { try { BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt")); writer.write(text); writer.close(); } catch (IOException e) { e.printStackTrace(); } } public void setText(String string) { text = string; } }