OSTRACISM CO.

C#とObjective-CとJavaと...

スレッド

 GraphicGripGropは画像検索という重い処理をさせるので、スレッドを利用してバックグラウンドで走らせる。というのはユーザによる停止要求を確実に行うためだ。

 面白いことにC#、Objective-C、Javaのどれも言語仕様としてスレッドを持たない。スレッドはあくまでライブラリの機能なのである。しかしスレッドに付き物の排他処理は言語仕様で用意されている。なんだか不思議だ。

C#

 TGraphicSearchクラスのインデックスファイルを作るMakeIndexFileメソッドで
m_continue = true;
m_work = new Thread(new ThreadStart(MakeIndexFileThread));
m_work.Start();
 これでMakeIndexFileThreadが新しいスレッドとして平行に動き出す。

 現在動いているかどうかは
public bool IsWorking() {
	return m_work != null;
}
 停止要求は
public void Stop() {
	lock(this) {
		m_continue = false;
	}
}
 ThreadクラスとThreadStartクラスの組み合わせが.NETのスレッド機能。lockキーワードがC#の排他処理機能。
 インデックスファイルを作る処理中、1ファイル毎にm_continue変数をチェックし、falseになったらスレッドから抜け出すようにしている。

Objective-C

 TGraphicSearchクラスのインデックスファイルを作るmakeIndexFileメソッドで
m_continue = YES;
m_work = YES;
[NSThread detachNewThreadSelector:@selector(makeIndexFileThread:) toTarget:self withObject:self];
 これでmakeIndexFileThreadが新しいスレッドとして平行に動き出す。

 現在動いているかどうかは
- (BOOL)isWorking {
	return m_work;
}
 停止要求は
- (void)stop {
	@synchronized(self) {
		m_continue = NO;
	}
}
 NSThreadクラスがCocoaのスレッド機能。@synchronizedキーワードがObjective-Cの排他処理機能。
 インデックスファイルを作る処理中、1ファイル毎にm_continue変数をチェックし、NOになったらスレッドから抜け出すようにしている。

Java

 C#とObjective-Cのスレッドの対象はあくまでメソッドであるのに対し、JavaではRunnableインターフェースを実装したクラスを用意しなくてはいけない。インターフェースということはメソッド名が決まってしまうということで、TGraphicSearchクラスにスレッド対象メソッドを複数用意することはできない。そこで、無名クラスを使うことになる。

 TGraphicSearchクラスのインデックスファイルを作るmakeIndexFileメソッドで
m_continue = true;
...
m_work = new Thread() {
    public void run() {
        ...
    }
    ...
}
m_work.start();
 これで無名Runnable実装クラスが新しいスレッドとして平行に動き出す。

 現在動いているかどうかは
public boolean isWorking() {
    return m_work != null;
}
 停止要求は
public void stop() {
	synchronized(this) {
		m_continue = false;
	}
}
 ThreadクラスとRunnableインターフェースがJava APIのスレッド機能。synchronizedキーワードがJavaの排他処理機能。
 インデックスファイルを作る処理中、1ファイル毎にm_continue変数をチェックし、falseになったらスレッドから抜け出すようにしている。

2005.07.04
2005.09.18
「インデックス」へ戻る

OSTRACISM CO.
OSTRA / Takeshi Yoneki