マルチスレッド
- Threadクラスを継承
- Threadクラスを継承したクラスを作成
- そのクラスでrunメソッドを宣言(オーバーライドさせるため)
- そのクラスのインスタンスを作成
- startメソッドを呼び出す
// クラス宣言
public class TestThread extends Thread {
// runを宣言
}
// スレッド開始
TestThread testThread = new TestThread();
testThread.start();
- JDKのソースを読むとわかるが、startメソッドがrunメソッドを呼び出す。runメソッドがスレッドのmainメソッドのようなものらしい。
- startで新しいスレッドが作られ、runで実行開始
- Runnableインターフェースを実装
- Runnableインターフェースをimplementsしたクラスでrunメソッドを実装
- Threadクラスのインスタンスを作成
- そのインスタンスのstartメソッドを呼び出す
// クラス宣言
public class TestThread implements Runnable {
// runを実装
}
// スレッド開始
TestThread testThread = new TestThread();
Thread thread = new Thread(testThread);
thread.start();
- 一般に継承する方法は簡単なクラス向け、インターフェースは複雑なクラス向け(すでに何らかのクラスを継承していればThreadクラスを継承できないから?)
- synchronized(後日掲載)
- Threadを待たせたい時はThread.sleep(time)。この場合はtry-catchを書く。waitメソッドとの違いに注意(waitはObjectクラスのメソッド)
パッケージ
- パッケージは名前の衝突を防ぐ為の仕組み
- importはパッケージ管理の用途のみ。クラスを取り込むとか考えると混乱する。
- 完全限定名とimportによるパッケージ管理。以下二つは同じ
java.util.Random r = new java.util.Random();
import java.util.*;
Random r = new Random();
- packageの宣言は"package org.toyo;"などと。
- Javaのパッケージ命名規則はドメイン名をひっくり返したもの。例えば"www.google.com"→"package com.google.www"などと。
- import宣言の*の意味。上位パッケージ宣言でサブパッケージが使えるわけではない。
// java.awtパッケージを利用
import java.awt.*;
// java.awt.imageを利用
import java.awt.image.*;
- クラス階層とは別。機能別にグループ化するなどの用途に。
- クラスのアクセス制御
修飾子 |
意味 |
public |
他のパッケージから見える |
(なし) |
同じパッケージから見える |
修飾子 |
意味 |
public |
他のパッケージから使える |
(なし) |
同じパッケージから使える |
protected |
同じパッケージとサブクラスから使える |
private |
クラス内のみで使える |
- String, Integerなどはコンパイラが自動でimportする(java.lang.*;?後ほど整理)
- チーム開発では、パッケージ指定のところで"*"はあまり使わないようにしなければどれがどのパッケージに入っているのかわからないので注意する。
- フィールドは基本的にはprivate、外部からのアクセスにはgetter, setterを記述する
- 何にも参照されなくなったインスタンスはゴミ(ガーベッジ)となるので、ゴミがたまってメモリが足りなくなってくると、ガーベッジコレクションが発動し、参照されていないインスタンスを破棄し、メモリ領域を回収する
- ガーベッジになるメモリがなく、メモリが不足している場合はOutOfMemoryErrorが発生する
- ガーベッジにする方法
- 変数に新しいインスタンスを代入
- nullを代入
- System.gc();でガーベッジコレクションを強制呼び出し可能
以上。