LoginSignup
1
2

Processingでスレッドthread処理

Last updated at Posted at 2024-03-06

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
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2