Let's Re⇒move -37ページ目

Javaの授業 23 [ スレッド その1 ]

スレッド

同時に2つ以上の動作を実行する(マルチスレッド)

本格的な内容は次回。


Threadクラスの動き


サンプル1
---------------------
ThreadCheck1.java
---------------------
public class ThreadCheck1 extends Thread {
int a;
String name;

public ThreadCheck1(String name) {
a = 100;
this.name = name;
}

public void run() {
for(int i = a; i > 0; i--) {
System.out.println(name + ":" + i);
}
}
}
---------------------
Execute.java
---------------------
public class Execute {
public static void main(String[] args) {
ThreadCheck1 th1 = new ThreadCheck1("スレッド1");
ThreadCheck1 th2 = new ThreadCheck1("スレッド2");

th1.start();
th2.start();

System.out.println("--------------- 終了? ---------------");
}
}
--------------------
まずはコンパイル、実行。

・startメソッドによってrunメソッドが実行される。
・runメソッドはmainメソッドからは独立して実行(同時並列)。

その結果今回は、メインメソッドが先に終了している。

Javaの授業 22 [ ガーベッジコレクション ]

ガーベッジコレクション

(※こういう仕組みがあるということを知っておく程度でOK)


Javaではメモリが足りなくなってくると
使われなくなったインスタンスのごみ集め(ガーベッジコレクション)
をし、メモリを開放するといったメモリ管理が自動的に行われる。



サンプル1【 インスタンスの生成とGC 】
----------------------------
Gc.Test.java
----------------------------
public class GcTest{
public static void main(String[] args){
while(true){
String s=new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println("残りメモリ="+Runtime.getRuntime().freeMemory());
}
}
}
----------------------------------
コンパイル、実行して残りメモリが途中で増えるのを確認して下さい。
(停止は ctrl + c)



サンプル2【 動的なGCの呼び出し 】

GcArray.java
-----------------------------------
public class GcArray{
public static void main(String[] args){
for(int n=0;true;n++){
int[] a=new int[1000];
if(n%100==0){
System.out.println("gcを呼び出します。");
System.gc();
}
System.out.println("残りメモリ="+Runtime.getRuntime().freeMemory());
}
}
}
-----------------------------------
意図的なタイミングでgc()を行う。動作を確認。



サンプル3【メモリ不足に陥る場合】
-----------------------------------
Overflow.java
-----------------------------------
import java.util.*;

public class Overflow{
static ArrayList<int[]> list = new ArrayList<int[]>();
public static void main(String[] args){
while(true){
int[] a = new int[1000];
for (int i=0; i<1000; i++){
a[i] = i;
}
list.add(a);
System.out.println("残りメモリ="+Runtime.getRuntime().freeMemory());
}
}
}
-----------------------------------
今回もメモリが増えるタイミングがあるがGCではなく
Java処理系がOSにメモリをさらに要求したものだと思われる。

Javaの授業 21 [ インターフェイス ]

インターフェイス

(今の段階では何に使う為のものかは考えなくてもよい。)


・抽象メソッドのみを持つ
・フィールドは定数(public static final )
・インスタンスは作れない(抽象クラスの為)
・~able(~できる)という名前をつける事が多い


※インターフェイスを実装する。
 (インターフェイスで定義された機能を実装するクラスを作る。)


記述

class Sample1 implements InterFace1{


継承は1つだけだが、実装は複数できる。


記述

class Sample1 implements InterFace1,InterFace2{


※実装したクラスにメソッドのオーバーライドを強制する。



インターフェイスを利用したデザインパターン


サンプル(ステイトパターン
-----------------------------
State.java(引数、戻り値に自分自身を持つ)
-----------------------------
public interface State {
public State proc(State sts);
}
-----------------------------

StateA.java(実装クラスA)
-----------------------------
public class StateA implements State{
StateA(State sts) {
}

public State proc(State sts) {
System.out.println("処理A実行");
return new StateB(this);
}

}
-----------------------------

StateB.java(実装クラスB)
-----------------------------
public class StateB implements State{
StateB(State sts) {
}

public State proc(State sts) {
System.out.println("処理B実行");
return null;
        // return new StateC(this);
}
}
}
-----------------------------

StateC.java(実装クラスC)
-----------------------------
public class StateC implements State{
StateC(State sts) {
}

public State proc(State sts) {
System.out.println("処理C実行");
return null;
}
}
-----------------------------

Execute.java
-----------------------------
public class Execute {
public static void main(String args[])
{
State sts = new StateA(null);

while(sts != null)
{
sts = sts.proc(sts);
}
}
}
------------------------------
※実行結果
処理A実行→処理B実行
State.BのreturnをCにすれば処理Cへ続く。
【stateを実装することによって動作をチェーンさせていける方法】


その他【strategy】パターン等も調べてみて下さい。