Java - スレッド


■ページ目次

Top

■スレッド

Top
■例
  1. つぎのような main() スレッドの名前を表示するアプリケーション"ThreadName01.java"を作成し、実行してください。
    1. public class ThreadName01 {
    2. public static void main(String[] args) {
    3. Thread th = Thread.currentThread();
    4. System.out.println("Thread Name = " + th.getName());
    5. }
    6. }

    □ 実行結果

    $ java ThreadName01
    Thread Name = main
    
Top

■スレッドの生成と起動

Top
■スレッドの生成(Thread クラスを継承)
■例題
  1. つぎの"ThreadSub01.java""ThreadMain011.java"を作成し、実行してください。
  2. "ThreadSub01.java"

    1. public class ThreadSub01 extends Thread {
    2. public void run() {
    3. System.out.println(getName() + " : " + "run");
    4. }
    5. }

    "ThreadMain011.java"

    1. public class ThreadMain011 {
    2. public static void main(String[] args) {
    3. System.out.println("program-start");
    4. ThreadSub01 th = new ThreadSub01();
    5. th.start();
    6. ThreadSub01 th1 = new ThreadSub01();
    7. th1.start();
    8. System.out.println("program-end");
    9. }
    10. }

    □ 実行結果

    $ java ThreadMain011
    program-start
    program-end
    Thread-1 : run
    Thread-2 : run
    
■実習
  1. 上記"ThreadMain011.java"で、start() メソッドを、run() メソッドに換えて、実行してください。("ThreadMain012.java")
    1. public class ThreadMain012 {
    2. public static void main(String[] args) {
    3. System.out.println("program-start");
    4. ThreadSub01 th = new ThreadSub01();
    5. th.run();
    6. ThreadSub01 th1 = new ThreadSub01();
    7. th1.run();
    8. System.out.println("program-end");
    9. }
    10. }

    □ 実行結果

    $ java ThreadMain012
    program-start
    Thread-0 : run
    Thread-1 : run
    program-end
    
Top
■スレッドの生成(Runnable インタフェースを実装)
■例題
  1. つぎの"ThreadSub021.java""ThreadMain021.java"を作成し、実行してください。
  2. "ThreadSub021.java"

    1. public class ThreadSub021 implements Runnable {
    2. public void run() {
    3. Thread th = Thread.currentThread();
    4. System.out.println(th.getName() + " run");
    5. }
    6. }

    "ThreadMain021.java"

    1. public class ThreadMain021 {
    2. public static void main(String[] args) {
    3. System.out.println("program-start");
    4. ThreadSub021 thable = new ThreadSub021();
    5. Thread th = new Thread(thable);
    6. th.start();
    7. Thread th1 = new Thread(thable);
    8. th1.start();
    9. System.out.println( "program-end" );
    10. }
    11. }

    □ 実行結果

    $ java ThreadMain021
    program-start
    Thread-1 run
    program-end
    Thread-2 run
    
■実習
  1. "ThreadSub021.java"をつぎのように改造して"ThreadSub022.java""ThreadMain022.java"を作成し、実行してください。
  2. "ThreadSub022.java"

    1. public class ThreadSub022 implements Runnable {
    2. public void run() {
    3. Thread th = Thread.currentThread();
    4. for (int i = 0; i < 10; i++) {
    5. System.out.println(th.getName() + " run " + i);
    6. }
    7. }
    8. }

    "ThreadMain022.java"

    1. public class ThreadMain022 {
    2. public static void main(String[] args) {
    3. System.out.println("program-start");
    4. ThreadSub022 thable = new ThreadSub022();
    5. Thread th = new Thread(thable);
    6. th.start();
    7. Thread th1 = new Thread(thable);
    8. th1.start();
    9. System.out.println( "program-end" );
    10. }
    11. }
    $ java ThreadMain022
    program-start
    Thread-1 run 0
    Thread-1 run 1
    Thread-1 run 2
    Thread-1 run 3
    Thread-1 run 4
    Thread-1 run 5
    Thread-1 run 6
    Thread-1 run 7
    Thread-2 run 0
    program-end
    Thread-2 run 1
    Thread-2 run 2
    Thread-2 run 3
    Thread-2 run 4
    Thread-2 run 5
    Thread-1 run 8
    Thread-1 run 9
    Thread-2 run 6
    Thread-2 run 7
    Thread-2 run 8
    Thread-2 run 9
    
    $ java ThreadMain022
    program-start
    Thread-1 run 0
    Thread-1 run 1
    Thread-1 run 2
    Thread-1 run 3
    Thread-1 run 4
    Thread-1 run 5
    Thread-1 run 6
    Thread-1 run 7
    Thread-1 run 8
    Thread-1 run 9
    program-end
    Thread-2 run 0
    Thread-2 run 1
    Thread-2 run 2
    Thread-2 run 3
    Thread-2 run 4
    Thread-2 run 5
    Thread-2 run 6
    Thread-2 run 7
    Thread-2 run 8
    Thread-2 run 9
    
Top

■スレッドの休止

■例題
  1. メインが2つのスレッドを生成します。スレッドは、0ミリ秒以上1秒未満のミリ秒分、スレッドを休止し、再開します。これを5回繰り返します。("ThreadSub11.java""ThreadMain11.java")
  2. "ThreadSub11.java"

    1. public class ThreadSub11 extends Thread {
    2. public void run() {
    3. for (int i = 0; i < 5; i++) {
    4. try {
    5. Thread.sleep((long)(Math.random()*1000)) ;
    6. } catch (InterruptedException e) {
    7. }
    8. System.out.println(getName() + " : " + "run (" + i + ")");
    9. }
    10. }
    11. }

    "ThreadMain11.java"

    1. public class ThreadMain11 {
    2. public static void main(String[] args) {
    3. System.out.println("program-start");
    4. ThreadSub11 th = new ThreadSub11();
    5. th.start();
    6. ThreadSub11 th1 = new ThreadSub11();
    7. th1.start();
    8. System.out.println("program-end");
    9. }
    10. }

    □ 実行結果

    $ java ThreadMain11
    program-start
    program-end
    Thread-2 : run (0)
    Thread-2 : run (1)
    Thread-2 : run (2)
    Thread-1 : run (0)
    Thread-2 : run (3)
    Thread-1 : run (1)
    Thread-1 : run (2)
    Thread-2 : run (4)
    Thread-1 : run (3)
    Thread-1 : run (4)
    
Top

■スレッドの待合せ

■例題
  1. 上記"ThreadMain11.java"で、2つのスレッドの終了を待ち合わせるように改良してください。("ThreadMain12.java")
    1. public class ThreadMain12 {
    2. public static void main(String[] args) {
    3. System.out.println("program-start");
    4. ThreadSub11 th = new ThreadSub11();
    5. th.start();
    6. ThreadSub11 th1 = new ThreadSub11();
    7. th1.start();
    8. try {
    9. th.join();
    10. th1.join();
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. System.out.println("program-end");
    15. }
    16. }

    □ 実行結果

    $ java ThreadMain12
    program-start
    Thread-1 : run (0)
    Thread-1 : run (1)
    Thread-2 : run (0)
    Thread-1 : run (2)
    Thread-1 : run (3)
    Thread-2 : run (1)
    Thread-1 : run (4)
    Thread-2 : run (2)
    Thread-2 : run (3)
    Thread-2 : run (4)
    program-end
    
Top

■スレッドへの割込み

■例題
  1. スレッドに割込みをかけるアプリケーション"Interrupt01.java"です。
    0秒から10秒の間のランダムな時間間隔に、スレッドに割込みをかけます。
    1. // 割り込みされるスレッド
    2. public class Interrupt02 extends Thread {
    3. public void run() {
    4. System.out.println(getName() + " がスタートしました");
    5. // カレント・スレッドならば繰り返し
    6. while (Interrupt01.i2 == Thread.currentThread()) {
    7. try {
    8. Thread.sleep(1000);
    9. } catch (InterruptedException e) {
    10. // 割り込まれたときの処理
    11. System.err.println("割り込みをキャッチしました");
    12. }
    13. System.out.print(".");
    14. }
    15. }
    16. }
    17. // Interrupt02 に割り込みをかけるスレッドを実装
    18. public class Interrupt01 extends Thread {
    19. static Thread i2;
    20. static Interrupt01 i1;
    21. public static void main(String args[]) {
    22. System.out.println("アプリケーションの停止は、CTRL+C を押下してください。");
    23. // スレッドの作成および開始
    24. i1 = new Interrupt01();
    25. i2 = new Thread(new Interrupt02());
    26. i1.start();
    27. i2.start();
    28. }
    29. public void run() {
    30. while (true) {
    31. try {
    32. Thread.sleep( ((int)(Math.random() * 10)) * 1000);
    33. // スレッドの実行に割り込み
    34. i2.interrupt();
    35. } catch (InterruptedException e) { }
    36. }
    37. }
    38. }

    □ 実行結果

    $ java Interrupt01
    アプリケーションの停止は、CTRL+C を押下してください。
    Thread-0 がスタートしました
    ..割り込みをキャッチしました
    .......割り込みをキャッチしました
    ......割り込みをキャッチしました
    .....割り込みをキャッチしました
    ..割り込みをキャッチしました
    ..割り込みをキャッチしました
    .......割り込みをキャッチしました
    
Top

■スレッドの実行の解放

■例題
Top

■スレッドの優先度

■例題
  1. メインから2つのスレッドを起動します。そのうちのひとつは、優先順位を変えません。もうひとつは、最大優先順位を設定します。それぞれの起動したスレッドから、さらにスレッドを起動します。このとき、優先順位は変えません。メインから見て、孫スレッドの優先順位を確認してください。("Priority01.java")
    1. public class Priority01 extends Thread {
    2. public static void main(String[] args) {
    3. System.out.println("Start main");
    4. Priority01 t1 = new Priority01();
    5. t1.start();
    6. Priority01 t2 = new Priority01();
    7. t2.setPriority(MAX_PRIORITY);
    8. t2.start();
    9. System.out.println("End main");
    10. }
    11. public void run() {
    12. System.out.println("Start " + getName());
    13. System.out.println("Priority = " + getPriority());
    14. new Priority02().start();
    15. System.out.println("End " + getName());
    16. }
    17. }
    18. public class Priority02 extends Thread {
    19. public void run() {
    20. System.out.println(" Start " + getName());
    21. System.out.println(" Priority = " + getPriority());
    22. System.out.println(" End " + getName());
    23. }
    24. }

    □ 実行結果

    $ java Priority01
    Start main
    Start Thread-2
    Priority = 10
    End Thread-2
      Start Thread-3
      Priority = 10
      End Thread-3
    End main
    Start Thread-1
    Priority = 5
    End Thread-1
      Start Thread-4
      Priority = 5
      End Thread-4
    
Top
■商品管理サーバーのマルチスレッド化
  1. 商品管理サーバーをマルチスレッドとします。 ("ProductServer.java")
    1. // 1701
    2. // package server;
    3. // import product.*;
    4. import java.util.*;
    5. import java.net.*;
    6. import java.io.*;
    7. // 商品サーバーです。
    8. public class ProductServer {
    9. public static void main(String[] args) throws Exception {
    10. final int SERVER_PORT = 54321;
    11. TreeMap p = new TreeMap();
    12. SetProduct s = new SetProduct("SA01", "パソコン・セット", 10, p);
    13. System.out.println("セット商品のインスタンスを生成しました。 s = " + s);
    14. System.out.println();
    15. AdminProduct ap = new AdminProduct();
    16. ap.read(s, args[0]);
    17. System.out.println("セット商品のデータを設定しました。 s = " + s);
    18. // サーバ用ソケットの作成
    19. ServerSocket serversock = new ServerSocket(SERVER_PORT);
    20. // 非同期制御データ・オブジェクトの作成
    21. while (true) {
    22. // クライアントからの接続要求待ち
    23. Socket sock = serversock.accept();
    24. new ProductServerThread(sock, s).start();
    25. }
    26. }
    27. }
    28. //クライアントと対応するサーバーのスレッドです。
    29. public class ProductServerThread extends Thread {
    30. private Socket sock;
    31. private SetProduct s;
    32. ProductServerThread(Socket sock, SetProduct s) {
    33. this.sock = sock;
    34. this.s = s;
    35. }
    36. public void run() {
    37. System.out.println("socket = " + sock);
    38. DataInputStream dis = null;
    39. DataOutputStream dos = null;
    40. try {
    41. // クライアントと対話処理するストリーム、ソケットを生成
    42. dis = new DataInputStream(sock.getInputStream());
    43. dos = new DataOutputStream(sock.getOutputStream());
    44. // 商品コードを受け取って、対応する商品を返す
    45. String code = dis.readUTF();
    46. String result = s.query(code);
    47. System.out.println(" [" + code + " = " + result + "]");
    48. dos.writeUTF(result);
    49. } catch (IOException e) {
    50. e.printStackTrace();
    51. } finally {
    52. try {
    53. // ストリーム、ソケットをクローズ
    54. dos.close();
    55. dis.close();
    56. sock.close();
    57. } catch (IOException e) {
    58. e.printStackTrace();
    59. }
    60. }
    61. }
    62. }
    $ java 
    
    $ java 
    
Top

■スレッドの同期

Top
■排他制御の例題
  1. ターミナルを3つ立ち上げます。ひとつはサーバー("NoSyncServer.java")、残りの2つでクライアント("SyncTestClient.java")を実行してください。
  2. "SyncTestClient.java"

    1. import java.net.*;
    2. import java.io.*;
    3. // サーバにアクセスする TCP クライアント
    4. public class SyncTestClient {
    5. public static void main(String args[]) {
    6. final int SERVER_PORT = 54321; // サーバのポート番号
    7. String serverName = "localhost";
    8. if (args.length == 1) {
    9. serverName = args[0];
    10. }
    11. try {
    12. // ソケットの作成
    13. Socket sock = new Socket(serverName, SERVER_PORT);
    14. // サーバとの通信用の入出力ストリームの獲得
    15. DataOutputStream dos =
    16. new DataOutputStream(sock.getOutputStream());
    17. DataInputStream dis =
    18. new DataInputStream(sock.getInputStream());
    19. // データの受信
    20. String data;
    21. data = dis.readUTF();
    22. System.out.println(data);
    23. // ストリーム、ソケットのクローズ
    24. dis.close();
    25. dos.close();
    26. sock.close();
    27. } catch (UnknownHostException e) {
    28. System.err.println("Host '" + serverName + "' is unknown");
    29. } catch (IOException e) {
    30. e.printStackTrace();
    31. }
    32. }
    33. }
    "NoSyncServer.java"
    1. import java.net.*;
    2. import java.io.*;
    3. // 複数クライアントの同時アクセスを受け付ける TCP サーバ
    4. public class NoSyncServer {
    5. public static void main(String args[]) throws Exception {
    6. final int SERVER_PORT = 54321; // サーバのポート番号
    7. // サーバ用ソケットの作成
    8. ServerSocket serversock = new ServerSocket(SERVER_PORT);
    9. // 非同期制御データ・オブジェクトの作成
    10. NoSyncData data = new NoSyncData();
    11. while (true) {
    12. // クライアントからの接続要求待ち
    13. Socket sock = serversock.accept();
    14. // クライアントと対話処理するスレッドの起動
    15. new NoSyncServerThread(sock, data).start();
    16. }
    17. }
    18. }
    19. // 接続済みクライアントと通信するスレッド
    20. public class NoSyncServerThread extends Thread {
    21. private Socket sock = null;
    22. NoSyncData data = null;
    23. NoSyncServerThread(Socket client, NoSyncData data) {
    24. this.sock = client;
    25. this.data = data;
    26. }
    27. // クライアントへのサービス
    28. public void run() {
    29. try {
    30. DataInputStream dis =
    31. new DataInputStream(sock.getInputStream());
    32. DataOutputStream dos =
    33. new DataOutputStream(sock.getOutputStream());
    34. // データ(処理結果)の送信
    35. dos.writeUTF("number = " + data.incrementNumber());
    36. // ストリーム、ソケットをクローズ
    37. dos.close();
    38. dis.close();
    39. sock.close();
    40. } catch (Exception e) {
    41. e.printStackTrace();
    42. }
    43. }
    44. }
    "NoSyncData.java"
    1. public class NoSyncData {
    2. private int number = 0;
    3. int incrementNumber() throws Exception {
    4. int w = number;
    5. Thread.sleep(1000);
    6. number = w + 1;
    7. System.out.println("number = " + number);
    8. return number;
    9. }
    10. }
    java SyncTestClient
    number = 1
    
    java SyncTestClient
    number = 1
    
    java NoSyncServer
    number = 1
    number = 1
    
  3. 上記サンプルで、サーバーを同期用のサーバー("SyncServer.java")に切り替えて実行してください。
  4. "SyncServer.java"

    1. import java.net.*;
    2. import java.io.*;
    3. // 複数クライアントの同時アクセスを受け付ける TCP サーバ
    4. public class SyncServer {
    5. public static void main(String args[]) throws Exception {
    6. final int SERVER_PORT = 54321; // サーバのポート番号
    7. // サーバ用ソケットの作成
    8. ServerSocket serversock = new ServerSocket(SERVER_PORT);
    9. // 非同期制御データ・オブジェクトの作成
    10. SyncData data = new SyncData();
    11. while (true) {
    12. // クライアントからの接続要求待ち
    13. Socket sock = serversock.accept();
    14. // クライアントと対話処理するスレッドの起動
    15. new SyncServerThread(sock, data).start();
    16. }
    17. }
    18. }
    19. // 接続済みクライアントと通信するスレッド
    20. public class SyncServerThread extends Thread {
    21. private Socket sock = null;
    22. SyncData data = null;
    23. SyncServerThread(Socket client, SyncData data) {
    24. this.sock = client;
    25. this.data = data;
    26. }
    27. // クライアントへのサービス
    28. public void run() {
    29. try {
    30. DataInputStream dis =
    31. new DataInputStream(sock.getInputStream());
    32. DataOutputStream dos =
    33. new DataOutputStream(sock.getOutputStream());
    34. // データ(処理結果)の送信
    35. dos.writeUTF("number = " + data.incrementNumber());
    36. // ストリーム、ソケットをクローズ
    37. dos.close();
    38. dis.close();
    39. sock.close();
    40. } catch (Exception e) {
    41. e.printStackTrace();
    42. }
    43. }
    44. }
    "SyncData.java"
    1. public class SyncData {
    2. private int number = 0;
    3. synchronized int incrementNumber() throws Exception {
    4. int w = number;
    5. Thread.sleep(1000);
    6. number = w + 1;
    7. System.out.println("number = " + number);
    8. return number;
    9. }
    10. }
    java SyncTestClient
    number = 1
    
    java SyncTestClient
    number = 2
    
    java NoSyncServer
    number = 1
    number = 2
    
Top
■デッド・ロック
Top
■同期制御の例題
  1. メモを渡すスレッドと受け取るスレッドの間で、文字列を渡します。
    ファイル名クラス名排他制御同期制御
    Memo01.javaMemo01, NoSyncMemo, NoSyncMemoGet, NoSyncMemoPut--
    Memo02.javaMemo02, ExclSyncMemo, ExclSyncMemoGet, ExclSyncMemoPutx-
    Memo03.javaMemo03, SyncMemo, SyncMemoGet, SyncMemoPutxx

    Memo01.java

    1. public class Memo01 {
    2. public static void main(String[] args) {
    3. System.out.println("Start main");
    4. NoSyncMemo m = new NoSyncMemo();
    5. new NoSyncMemoPut(m, "Hello").start();
    6. new NoSyncMemoPut(m, "Java").start();
    7. new NoSyncMemoPut(m, "World").start();
    8. new NoSyncMemoGet(m).start();
    9. new NoSyncMemoGet(m).start();
    10. new NoSyncMemoGet(m).start();
    11. System.out.println("End main");
    12. }
    13. }
    14. public class NoSyncMemoPut extends Thread {
    15. NoSyncMemo m;
    16. String s;
    17. NoSyncMemoPut(NoSyncMemo m, String s) {
    18. this.m = m;
    19. this.s = s;
    20. }
    21. public void run() {
    22. m.putMemo(s);
    23. }
    24. }
    25. public class NoSyncMemoGet extends Thread {
    26. NoSyncMemo m;
    27. NoSyncMemoGet(NoSyncMemo m) {
    28. this.m = m;
    29. }
    30. public void run() {
    31. System.out.println(m.getMemo());
    32. }
    33. }
    34. public class NoSyncMemo {
    35. private String m;
    36. public void putMemo(String m) {
    37. this.m = m;
    38. }
    39. public String getMemo() {
    40. return m;
    41. }
    42. }

    □ 実行結果

    java Memo01
    Start main
    End main
    World
    World
    World
    

    Memo02.java

    1. public class Memo02 {
    2. public static void main(String[] args) {
    3. System.out.println("Start main");
    4. ExclMemo m = new ExclMemo();
    5. new ExclMemoPut(m, "Hello").start();
    6. new ExclMemoPut(m, "Java").start();
    7. new ExclMemoPut(m, "World").start();
    8. new ExclMemoGet(m).start();
    9. new ExclMemoGet(m).start();
    10. new ExclMemoGet(m).start();
    11. System.out.println("End main");
    12. }
    13. }
    14. public class ExclMemoPut extends Thread {
    15. ExclMemo m;
    16. String s;
    17. ExclMemoPut(ExclMemo m, String s) {
    18. this.m = m;
    19. this.s = s;
    20. }
    21. public void run() {
    22. m.putMemo(s);
    23. }
    24. }
    25. public class ExclMemoGet extends Thread {
    26. ExclMemo m;
    27. ExclMemoGet(ExclMemo m) {
    28. this.m = m;
    29. }
    30. public void run() {
    31. System.out.println(m.getMemo());
    32. }
    33. }
    34. public class ExclMemo {
    35. private String m;
    36. public synchronized void putMemo(String m) {
    37. this.m = m;
    38. }
    39. public synchronized String getMemo() {
    40. return m;
    41. }
    42. }

    □ 実行結果

    java Memo02
    Start main
    End main
    World
    World
    World
    

    Memo03.java

    1. public class Memo03 {
    2. public static void main(String[] args) {
    3. System.out.println("Start main");
    4. SyncMemo m = new SyncMemo();
    5. new SyncMemoPut(m, "Hello").start();
    6. new SyncMemoPut(m, "Java").start();
    7. new SyncMemoPut(m, "World").start();
    8. new SyncMemoGet(m).start();
    9. new SyncMemoGet(m).start();
    10. new SyncMemoGet(m).start();
    11. System.out.println("End main");
    12. }
    13. }
    14. public class SyncMemoPut extends Thread {
    15. SyncMemo m;
    16. String s;
    17. SyncMemoPut(SyncMemo m, String s) {
    18. this.m = m;
    19. this.s = s;
    20. }
    21. public void run() {
    22. m.putMemo(s);
    23. }
    24. }
    25. public class SyncMemoGet extends Thread {
    26. SyncMemo m;
    27. SyncMemoGet(SyncMemo m) {
    28. this.m = m;
    29. }
    30. public void run() {
    31. System.out.println(m.getMemo());
    32. }
    33. }
    34. public class SyncMemo {
    35. private boolean st;
    36. private String m;
    37. public synchronized void putMemo(String m) {
    38. while (st) {
    39. try {
    40. wait();
    41. } catch (InterruptedException e) {
    42. }
    43. }
    44. st = true;
    45. this.m = m;
    46. notify();
    47. }
    48. public synchronized String getMemo() {
    49. while (!st) {
    50. try {
    51. wait();
    52. } catch (InterruptedException e) {
    53. }
    54. }
    55. st = false;
    56. notify();
    57. return m;
    58. }
    59. }

    □ 実行結果

    java Memo03
    Start main
    End main
    Hello
    Java
    World
    
Top
■商品管理サーバーの排他制御
  1. 商品管理サーバーをマルチスレッドとします。 ("SetProduct.java")
    1. // 1702
    2. // package product;
    3. import java.util.*;
    4. // セット商品クラスです。
    5. // ひとつまたは複数の商品を集めて、割引したものをセット商品として扱います。
    6. // セット商品に対するフィールドやフィールドを操作するためのメソッドを
    7. // 提供しています。
    8. public class SetProduct extends AbstractProduct implements DiscountInterface {
    9. private int discount; // セット商品割引率
    10. private Map products; // セット商品リスト
    11. // セット商品クラスのコンストラクター。
    12. public SetProduct(String code, String name, int discount, Map products) {
    13. setCode(code);
    14. setName(name);
    15. setDiscount(discount);
    16. setProducts(products);
    17. }
    18. // セット商品オブジェクトを文字列化します。
    19. public synchronized String toString() {
    20. return "[" + getCode() + ", " + getName() + ", " + getDiscount() + ", "
    21. + getPrice() + "]";
    22. }
    23. // 商品の売値の値を取得します。
    24. public synchronized int getPrice() {
    25. int price = 0;
    26. Iterator itr = products.values().iterator();
    27. while (itr.hasNext()) {
    28. price += ((Product)itr.next()).getPrice();
    29. }
    30. return (int)(price * (1 - discount / 100.0));
    31. }
    32. // 商品割引率に値を設定します。
    33. public synchronized void setDiscount(int discount) {
    34. if (discount < 10 || discount > 100) {
    35. this.discount = 0;
    36. return;
    37. }
    38. this.discount = discount;
    39. }
    40. // 商品割引率に値を設定します。
    41. public synchronized void setDiscount(String discount) {
    42. try {
    43. setDiscount(Integer.parseInt(discount));
    44. } catch (NumberFormatException e) {
    45. setDiscount(0);
    46. e.printStackTrace();
    47. } catch (Exception e) {
    48. setDiscount(0);
    49. e.printStackTrace();
    50. }
    51. }
    52. // 商品割引率の値を取得します。
    53. public synchronized int getDiscount() {
    54. return discount;
    55. }
    56. // セット商品に値を設定します。
    57. public synchronized void setProducts(Map products) {
    58. this.products = products;
    59. }
    60. // セット商品を取得します。
    61. public synchronized Map getProducts() {
    62. return products;
    63. }
    64. // 商品を追加します。
    65. public synchronized void add(Product product) {
    66. products.put(product.getCode(), product);
    67. }
    68. // 商品を更新します。
    69. public synchronized void update(Product product) {
    70. products.put(product.getCode(), product);
    71. }
    72. // 商品を削除します。
    73. public synchronized void remove(String code) {
    74. products.remove(code);
    75. }
    76. // 商品を照会します。
    77. public synchronized String query(String code) {
    78. if (!products.containsKey(code)) {
    79. return "[Not Found]";
    80. }
    81. return ((Product)(products.get(code))).toString();
    82. }
    83. }
    $ java 
    
    $ java 
    
Top

inserted by FC2 system