とよぶ

歌いながらコード書いてます

マルチスレッド、パッケージ、ガーベッジコレクション

マルチスレッド

  • スレッド作成方法
  1. Threadクラスを継承
    1. Threadクラスを継承したクラスを作成
    2. そのクラスでrunメソッドを宣言(オーバーライドさせるため)
    3. そのクラスのインスタンスを作成
    4. startメソッドを呼び出す
// クラス宣言
public class TestThread extends Thread {
    // runを宣言
}
// スレッド開始
TestThread testThread = new TestThread();
testThread.start();
  • JDKのソースを読むとわかるが、startメソッドがrunメソッドを呼び出す。runメソッドがスレッドのmainメソッドのようなものらしい。
  • startで新しいスレッドが作られ、runで実行開始
  1. Runnableインターフェースを実装
    1. Runnableインターフェースをimplementsしたクラスでrunメソッドを実装
    2. Threadクラスのインスタンスを作成
    3. そのインスタンスの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を記述する

ガーベッジコレクション

以上。