Processingでスレッド処理
標準でスレッド機能がある。
しかし、変数の受け渡しはできない。
void setup() {
}
void draw() {
thread("myThread");
}
void myThread() {
println("Hi");
}
重い計算を並列に計算して、マルチコアCPUの性能を引き出したいときに困る。
スレッドにid番号を振って、処理を振り分けたい。
Threadを使い、idを伴うプログラム
10個のスレッドを作成するサンプル。作成時にid番号を割り振る。
delayを追加することで、若干、処理のタイミングがズレて、printの実行タイミングがずれる。よって、実行のたびに、出力の順番が変わる。
実行後、1秒経過した時点で、一度に10個のprintが実行されるので、並列処理されていることが確認できる。
追記:
各スレッド終了を確認して、合算値を計算し、表示するようにした。285になっていれば、問題なし。
processing
myThread myTh [] = new myThread[10];
void setup() {
for (int i=0; i<10; i++) {
myTh[i] = new myThread(i);
}
for (int i=0; i<10; i++) {
myTh[i].start();
}
int result=0;
for (int i=0; i<10; i++) {
while(!myTh[i].finish){
print("");
}
result+=myTh[i].r;
}
println(result);
}
void draw() {
}
class myThread extends Thread {
int id;
int r;
boolean finish;
myThread(int n) {
id = n;
}
void run() {
delay(1000);
r = id*id;
println(id+"^2="+id*id);
finish = true;
}
}
出力例
0^2=0
4^2=16
7^2=49
2^2=4
6^2=36
1^2=1
8^2=64
5^2=25
9^2=81
3^2=9
285
Runnableを使ったidを伴うスレッド処理
未定
Callableを使ったidを伴うスレッド処理
同様な処理をjavaのCallableを使って実装した。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Callable;
void setup() {
ExecutorService[] ex = new ExecutorService[10];
Future<Integer>[] futureResult = new Future[10];
for (int i=0; i<10; i++) {
ex[i] = Executors.newSingleThreadExecutor();
futureResult[i] = ex[i].submit(new myFunc(i));
}
try {
int result = 0;
for (int i=0; i<10; i++) {
result += futureResult[i].get();
}
println(result);
}
catch (Exception e) {
println(e);
}
}
void draw() {
}
public class myFunc implements Callable<Integer> {
int id;
public Integer call() {
delay(1000);
println(id+"^2="+id*id);
return id*id;
}
public myFunc(int _i){
id = _i;
}
}
出力例
4^2=16
6^2=36
0^2=0
1^2=1
8^2=64
5^2=25
9^2=81
7^2=49
2^2=4
3^2=9
285