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