gpt4 book ai didi

java - 创建线程后如何将信息传递给线程

转载 作者:行者123 更新时间:2023-12-01 04:55:19 25 4
gpt4 key购买 nike

如果你看一下代码,我有两个全局的 ArrayList,它们被调用、按下和释放。我要做的就是用要按下的键更新这些数组,然后将这些更新的数组传递给我的线程,或者更新线程..这是我对我必须做的事情有点迷失的部分。

当前示例(如​​果运行则未经测试)是我在实际程序中的基本示例。当我运行它时,它会按一次按钮,然后它会抛出错误,我不记得错误,因为我现在无法测试它,但这与我使用线程的方式有关。

问题线程启动后,如何将数组传递给我的线程。

代码示例:

import oscP5.OscEventListener;
import oscP5.OscMessage;
import oscP5.OscP5;
import oscP5.OscStatus;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class Main implements OscEventListener {

protected BlockingQueue<Integer> _KeyQue = new ArrayBlockingQueue<>(1024);

Producer producer = new Producer(this._KeyQue);
Consumer consumer = new Consumer(this._KeyQue);
ThreadTest threadTest = new ThreadTest(this._KeyQue);

Thread prod;
Thread con;
Thread threadT;

OscP5 osc = new OscP5(this, 22556);

public static void main(String[] argv) {
Main main = new Main();
main.setup();
}

public void setup() {
prod = new Thread(producer);
con = new Thread(consumer);
threadT = new Thread(threadTest);

prod.start();
con.start();
threadT.start();

}

@Override
public void oscEvent(OscMessage theMessage) {
float val = Float.parseFloat(theMessage.arguments()[0].toString());

if (val == 1.0) {
producer.addKey(KeyEvent.VK_W);
producer.addKey(KeyEvent.VK_S);
} else {
consumer.removeKey(KeyEvent.VK_S);
}
threadTest.run();
}

@Override
public void oscStatus(OscStatus theStatus) {}

public class Producer implements Runnable {
protected BlockingQueue<Integer> _KeyQue = null;

public void addKey(int key) {
try {
this._KeyQue.put(key);
System.out.println("Key " + key +" added to queue");
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}

public Producer(BlockingQueue<Integer> _KeyQue) {
this._KeyQue = _KeyQue;
}

public void run() {

}
}

public class Consumer implements Runnable {
protected BlockingQueue<Integer> _KeyQue = null;

public void removeKey(int key) {
try {
this._KeyQue.remove(key);
System.out.println("key " + key + " removed from queue");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

public Consumer(BlockingQueue<Integer> _KeyQue) {
this._KeyQue = _KeyQue;
}

public void run() {

}
}

public class ThreadTest implements Runnable {

protected BlockingQueue<Integer> _KeyQue = null;

public ThreadTest(BlockingQueue<Integer> _KeyQue) {
this._KeyQue = _KeyQue;
}

public void run() {
try {
Robot robot = new Robot();

while(!this._KeyQue.isEmpty()) {
for (Integer x : this._KeyQue) {
System.out.println("Keys in que: " + x);
Thread.sleep(500);
}
}

} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}

编辑: 好的,我已经查看了线程和 BlockingQueue,但我仍然不明白如何继续运行 ThreadTest 的 run() 方法无需锁定程序。在此示例中,它根本不运行。当我直接调用 threadTest.run() 时,它会锁定其中的程序,并且不允许添加或删除元素。

所以我需要做的是能够在后台运行一个不断运行的线程,循环通过*_KeysQueue()*,并在本例中打印出与键。这一切都应该在允许我添加和删除 key 的同时发生。

最佳答案

您可以拥有一个 BlockingQueue 和一个方法来添加将从每个其他线程调用的元素。您可以拥有一个静态方法 addKey,该方法可以从所有其他线程访问,并且会查找将新 key 添加到 BlockingQueue

您可以在那里使用the producer-consumer pattern你可以看到这本书Java Concurrency In Practice或者在博客 The Java Specialists 中引导我找到这本书的链接。本书提供了所有队列、并发或同步列表的示例,以及实现代码来完成多项任务的方法,并且所有这些都无需停下来阅读 50 页的内容。每个问题的一个示例和几段。

关于java - 创建线程后如何将信息传递给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14295991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com