2009年6月14日日曜日

Java マルチスレッド

スレッドとはプログラムの処理単位のことです
マルチスレッドとは同時に複数の処理を並行して行うことを言います。
マルチスレッドを実現するにはjava.lang.Threadクラスを継承する方法と、java.lang.Runnableインターフェースを実装する方法があります。


java.lang.Threadクラスを継承する方法


Threadを継承するクラスはrunメソッドをオーバーライドします。
package multiThreadSample;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ThreadSample01 extends Frame implements ActionListener{

private static final long serialVersionUID = 1L;

public static void main(String[] args){
new ThreadSample01();
}

Label lbl1;
Label lbl2;
Button btnRun;

public ThreadSample01(){
this.setTitle("ThreadSample01");
this.setSize(300,300);
this.setLayout(new GridLayout(4,1));

lbl1 = new Label();
this.add(lbl1);
lbl2 = new Label();
this.add(lbl2);

Panel p1 = new Panel();

btnRun = new Button("Run");
btnRun.addActionListener(this);
p1.add(btnRun);

this.add(p1);

this.setVisible(true);
}

public void actionPerformed(ActionEvent arg0) {
MyThread t1 = new MyThread(lbl1,500);
t1.start();

MyThread t2 = new MyThread(lbl2,1000);
t2.start();

}
}


class MyThread extends Thread{
Label lbl;
int time;

public MyThread(Label lbl, int time){
this.lbl = lbl;
this.time = time;
}

public void run() {
for (int i = 0; i < 100; i++){
lbl.setText("Count:" + i);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


}

java.lang.Runnableインターフェースを実装する方法

Runnableインターフェースをを実装するクラスもrunメソッドをオーバーライドします。
class MyClass implements Runnable {
public void run(){
//マルチスレッドで実行する処理を記述します。
}
}
ThreadクラスのインスタンスするコンストラクタにRunnableインターフェースをを実装するクラスのインスタンスを指定し、 Threadクラスのstartメソッドを実行することによって、Runnableインターフェースをを実装するクラスのrunメソッドが呼び出されスレッドが起動します。
Thread t = new Thread(new MyClass());
t.start();
以下の例では1つめのスレッドでラベル1に500ミリ秒間隔で数字をカウントアップした値を表示し、2つめのスレッドでラベル2に1000ミリ秒間隔で数字をカウントアップした値を表示します。
package multiThreadSample;

import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ThreadSample02 extends Frame implements ActionListener{

private static final long serialVersionUID = 1L;

public static void main(String[] args){
new ThreadSample02();
}

Label lbl1;
Label lbl2;
Button btnRun;

public ThreadSample02(){
this.setTitle("ThreadSample02");
this.setSize(300,300);
this.setLayout(new GridLayout(3,1));

lbl1 = new Label();
this.add(lbl1);
lbl2 = new Label();
this.add(lbl2);

Panel p1 = new Panel();
btnRun = new Button("Run");
btnRun.addActionListener(this);
p1.add(btnRun);
this.add(p1);

this.setVisible(true);
}

public void actionPerformed(ActionEvent arg0) {
Thread t1 = new Thread(new MyThread(lbl1,500));
t1.start();

Thread t2 = new Thread(new MyThread(lbl2,1000));
t2.start();

} 
}

class MyThread implements Runnable{
Label lbl;
int time;

public MyThread(Label lbl, int time){
this.lbl = lbl;
this.time = time;
}

public void run() {
for (int i = 0; i < 100; i++){
lbl.setText("Count:" + i);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

0 件のコメント: