|
| |
2002/02/03 田中宏和 |
| Last Update
2003/01/13 |
|
 |
スレッド編 |
 |
|
| ◆スレッドとは? |
| スレッドとはプログラムの処理単位のことです。mainメソッドを実行している処理も一つのスレッドです。そのスレッドのことをメインスレッドと呼びます。メインスレッドが終了するとプログラムも終了します。 |
| ◆マルチスレッドとは? |
| マルチスレッドとはメインスレッドとは別に処理単位(スレッド)を複数生成して、並行して複数の処理を行うことを言います。見かけ上は複数の処理を同時に実行しているように見えますが、実際にはCPUの処理時間を短い単位で分割して複数の処理単位(スレッド)に順番に割り当てることによって同時に実行しているように見せています。 |
| ◆ここでの環境 |
| OS |
Windows 2000 |
| J2SE SDK |
1.4.0 |
|
|
|
| ◆Java実行環境の構築 |
| アプリケーション編を参考にしてJava実行環境を構築してください。 |
| ◆Javaでのマルチスレッドの実現方法 |
| Javaでマルチスレッドを実現するにはThread クラスを利用します。Threadクラスを継承したオブジェクトを作成してrunメソッドをオーバーライドします。runメソッドは直接呼び出してはいけません。Threadクラスのstartメソッドを実行することによってrunメソッドが適切に呼び出されスレッドが起動するようになっています。 |
class HelloWorldThread extends Thread {
public void run() {
// このスレッドの処理を記述
}
} |
|
|
| ◆Javaソースコード |
| ここでは「Helloスレッド」と「Worldスレッド」の2つのスレッドを生成してその動きを見てみたいと思います。 |
| HelloWorldThread.java(ここからダウンロード) |
public class HelloWorldThread extends Thread {
// コンストラクタ
public HelloWorldThread(String name) {
super(name);
}
public static void main(String[] args) {
// スレッドオブジェクトのインスタンスを生成
HelloWorldThread thread1 = new HelloWorldThread("Helloスレッド");
HelloWorldThread thread2 = new HelloWorldThread("Worldスレッド");
// スレッドを開始
thread1.start();
thread2.start();
}
public void run() {
for (int i=0;i<10;i++) {
// スレッド名とループ数を表示します
System.out.println(this.getName() + " : " + i);
try {
// 500ミリ秒間スレッドを停止します
sleep(500);
} catch (InterruptedException e) {
}
}
}
} |
|
|
|
| ◆コンパイルと実行 |
| コマンドプロンプト |
| C:\JavaHello\Thread>javac
HelloWorldThread.java
C:\JavaHello\Thread>java HelloWorldThread
Helloスレッド : 0
Worldスレッド : 0
Helloスレッド : 1
Worldスレッド : 1
Helloスレッド : 2
Worldスレッド : 2
Helloスレッド : 3
Worldスレッド : 3
Helloスレッド : 4
Worldスレッド : 4
Helloスレッド : 5
Worldスレッド : 5
Worldスレッド : 6
Helloスレッド : 6
Worldスレッド : 7
Helloスレッド : 7
Worldスレッド : 8
Helloスレッド : 8
Worldスレッド : 9
Helloスレッド : 9
C:\JavaHello\Thread> |
|
| おおおおお!同時に実行されていますね!! |
| |
| ◆Runnableインターフェースを使用する |
| Runnableインターフェースを実装(implements)したクラスを使用することでマルチスレッドを利用できる方法もあります。 |
class MyRunnable implements Runnable { public void run() { // このスレッドの処理を記述 } } |
|
| この場合Threadを生成するときにRunnableインターフェースを実装したクラスのインスタンスをコンストラクタの引数に渡します。 |
Thread thread = new Thread(new MyRunnable());。 thread.start();
|
|
| ■ソースコードの作成 |
| アプレットクラスにRunnableインターフェースを実装してマルチスレッドで動作するアプレットを作成します。ここでは1秒に一回、現在の時刻を再描画するためにスレッドを使用します。 |
| HelloWorldClockApplet.java(ここからダウンロード) |
import java.awt.Graphics;
import java.applet.Applet;
import java.util.Date;
public class HelloWorldClockApplet extends Applet implements Runnable {
Thread thread = null;;
// paintメソッドをオーバーライド
public void paint(Graphics g) {
// 現在の時刻を座標(20,20)の位置に描画
Date now = new Date();
g.drawString(now.toString() , 20, 20);
}
// startメソッドをオーバーライド
public void start() {
if (thread==null) {
// スレッドを生成
thread = new Thread(this);
// スレッドを開始
thread.start();
}
}
// stopメソッドをオーバーライド
public void stop() {
// スレッド終了
thread = null;
}
// スレッドの処理
public void run() {
while (thread!=null) {
// 再描画します
repaint();
try {
// スレッドを1000ミリ秒停止します
thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
} |
|
|
| ■表示用HTMLファイルの作成 |
| ClockApplet.html(ここからダウンロード) |
<html> <head> <title>時計アプレット</title> </head> <body> <applet code = "HelloWorldClockApplet" width="200" height="100"> </applet> </body> </html> |
|
|
| ■コンパイル |
| コマンドプロンプト |
| C:\JavaHello\Thread>javac
HelloWorldClockApplet.java
C:\JavaHello\Thread> |
|
| ■表示 |
| 作成したHTMLファイルをダブルクリックして表示します。アプレットのクラスファイルはHTMLファイルと同じ場所に置いてください。 |
 |
| おおおおおお!表示されましたね! |
| うまく表示できない場合は、IEのメニューの「ツール」→「インターネットオプション」→「詳細設定」で「<applet>にJava
2 v○○を使用」にチェックを入れてから表示してみてください。 |
| |
■関連
アプレット編 |
■書籍
Java関連の書籍 |
|
| |
|
| |
| ツールの部屋
- Java関連の書籍 - デザインパターン - 情報交換掲示板
- HOME |