在另一个线程中运行代码

时间:2014-11-29 12:49:28

标签: java multithreading processing

我正在编写一个Processing项目(Processing基于Java)。我想在另一个线程(主线程)中的一个线程内运行代码。

//This method runs in the main thread
public void draw() {

}

//This is a callback that runs in a separate thread
void addTuioObject(TuioObject tobj) {
  rect(0, 0, 20, 10); 
}

rect(0,0,20,10)不在主线程中运行(它应该在屏幕上绘制一个矩形)。我想这是因为它在一个单独的线程中运行。我如何在主线程中运行此代码?

2 个答案:

答案 0 :(得分:1)

最常见的解决方案是提供状态变量并根据当前状态制作draw()方法。

状态变量可以像单个基本类型(例如布尔值)或复杂对象一样简单。

理念是:

  • 主线程(处理中的动画线程)为每个帧调用draw()draw()方法使用状态变量绘制屏幕。
  • 其他帖子可以修改状态,但与绘图或像素无关......

考虑两个例子:

1)简单状态(单个布尔变量)

// state variable
private boolean shouldPaint;

void draw() {
    background(0);

    fill(200);
    rect(10, 10, 30, 30);

    if (shouldPaint) {
        rect(50, 10, 30, 30);
    }
}

// called in other thread
someMethod() {
    shouldPaint = !shouldPaint;
}

2)更复杂的状态

// state variable
private PVector[] vectors = new PVector[5];
private int index = 0;

void draw() {
    background(0);
    fill(200);

    for (PVector v : vectors) {
        if (v != null) {
            rect(v.x, v.y, 10, 10);
        }
    }

}

// called by other thread
void someMethod() {
    if (index >= vectors.length) {
        index = 0;
    }

    // vector for current index value
    PVector v = vectors[index];

    if (v == null) {
        vectors[index] = new PVector(index * 20, index * 20);
    } else {
        vectors[index].add(new PVector(30, 0));
    }

    index++;
}

请记住,draw()方法每秒调用60次(如果是默认帧速率)。每个draw()执行都会修改屏幕(像素)缓冲区。如果您想从屏幕中删除不需要的对象,您应该使用draw()方法启动background(color)清除整个缓冲区的方法。

答案 1 :(得分:0)

有几种方法可以做到这一点。取决于您实际想要实现的目标。如果你正在使用awt或swing你的绘图代码实际上不应该在主线程中运行,而是在awt线程中运行。您可以使用SwingUtils将工作分派给该线程。如果你真的想在另一个线程(例如main)中执行代码,你需要确保目标线程能够获取新的工作,例如从队列中。