Java-6 ?>

Java-6

スレッド処理

スレッドとは

スレッドとは1つのプログラム上で動作するある特定の処理のことを言います。1つのプログラム上でいくつもの処理を同時に実行しているかのように見せたい時に使用します。このようなプログラムのことをマルチスレッドプログラムと言います。

Javaはマルチスレッドを取り扱うことのできる言語です。たとえば、1つのプログラムの中で、通信処理を行いながら、同時に計算処理を行うことなどができます。このような複数のスレッドを取り扱うプログラムを作成することを、「マルチスレッドプログラミング」といいます。以下のような実装になります。

スレッドの排他制御(同期処理) – synchronized

上記のようなプログラムを実行した場合、作ったスレッドの数1000と表示して欲しいのに、複数のスレッドが処理を同時実行しているため、実行するたび出力結果がバラバラになります。

複数のスレッドが処理を同時実行を行わせないようにするのがsynchronizedです。使い方は以下のようになります。

または

と実装します。

以下のサイトを確認してください。

マルチスレッドプログラミング
http://www.techscore.com/tech/Java/JavaSE/Thread/index/

class以外の型

interface – インタフェース

interfaceとは抽象メソッドしか持たないクラスのようなものです。インタフェースはクラスによって実装 implementsされ、実装クラスはインタフェースで宣言されている抽象メソッドを実装します。

課題:解説と一緒に手を動かしながらinterfaceを作成してみよう

interfaceを作成

「ファイル」または「右クリック」から「新規」→「インターフェース」を選択する。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-16-1-02-23
名前にIbcInterfaceを入力し、完了をクリックするとこのようにインターフェースが作成されます。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-16-1-13-38

interfaceの使い方

interfaceを以下のように実装してください。

新しくStopWatchというクラスを作成します。

先ほどのIbcInterfaceimplementsしましょう。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-17-2-07-28
エラーになるので赤ランプをクリック
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-17-2-07-52
「実装されていないメソッドを追加」をクリックすると勝手にメソッドが実装されます。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-17-2-08-05

列挙型 – enum型

JavaSE5から追加された機能で一連の値を定義する型になっています。列挙型はフィールド名の定数static finalと同様な使い方をします。
例えば以下のコードはenumを使う事ができます。

課題:解説と一緒に手を動かしながらenum型を作成してみよう

enum型の作成

「ファイル」または「右クリック」から「新規」→「列挙型」を選択する。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-17-0-57-20
名前にIBCEnumを入力し、完了をクリックするとこのように列挙型が作成されます。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-17-0-58-06

enumの使い方

先程作成したenum型に値を設定します。設定の方法は以下のように、型名だけを定義します。

そして最初の信号機コードをIBCEnumを使うと以下のようになります。

enum==equalsswitch文などを使って比較することができます。

以下のサイトを参考にしてください。

7ステップで理解するJavaでの列挙型
http://www.atmarkit.co.jp/ait/articles/1103/03/news107.html
今さら聞けない!4つのステップで理解するJavaの列挙型Enum
http://blog.maplesystems.co.jp/programming/2690.html

Optional型

JavaSE8から追加された機能です。Optionalクラスは値を持たない場合がある(nullである)ことを表すコンテナオブジェクトで、nullをより安全に扱うためのメソッドを提供しています。

今までは戻り値が nullの可能性がある場合はNullPointerExceptionを防ぐためにif文でnullチェックをしていました。

if文によるnullチェックは、どうしても可読性が下がります。
Optionalを使用すると値が存在する(null以外)場合だけ処理することを一文で表現できます。

Optionalの使い方

ifPresentは値を返しません。

Optionalの値を使った処理の結果、値を返したい場合はmapメソッドを使用します。

mapメソッドの戻り値は、ラムダ式の戻り値をラップしたOptionalになります。
Optionalから値を取得したい場合、以下のメソッドが使用できます。

メソッド 値が無い場合の処理
get() NoSuchElementException をスロー
orElse(T other) 引数で指定した値を返す
orElseGet(Supplier<? extends T> other) Supplier の get メソッドを実行

実装例

以下のサイトを参考にしてください。

Java 8 “Optional” ~ これからのnullとの付き合い方 ~
http://qiita.com/shindooo/items/815d651a72f568112910

演習問題

問題1:スレッドの排他制御(同期処理)のIbmJava6_Thread2synchronizedを実装し、処理を完成させないさい。
問題2:血液型を定義したenumを作成しなさい。
問題3:問題2で作成した血液型のenumswitchを使って血液型を判定するプログラムを作りなさい。
問題4:以下のコードをOptional型を使って実装しなおしてください。

解答:a-6