首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在创建线程后将信息传递给线程

如何在创建线程后将信息传递给线程
EN

Stack Overflow用户
提问于 2013-01-12 17:38:27
回答 3查看 177关注 0票数 1

如果您看一下代码,我有两个ArrayLists,它们被调用、按下和发布,它们是全局的。我要做的是用键更新这些数组,然后将这些更新的数组传递给我的线程,或者更新线程。这是我有点不知所措的地方。

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

问题:一旦线程启动,如何将数组传递给线程。

代码示例:

代码语言:javascript
复制
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());
        }
    }
}
}

编辑: Ok,所以我看了一下线程和BlockingQueue,但是我仍然不知道如何继续运行线程测试的run()方法而不锁定程序。在本例中,它根本不运行。当我直接调用threadTest.run()时,它会在其中锁定程序,不允许添加或删除元素。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-12 18:27:27

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

您可以在那里使用生产者-消费者模式,您可以在博客Java专家中看到图书Java并发在实践中的应用或指向这本书的链接。本书提供了所有队列、并发列表或同步列表的示例,实现代码以完成多项任务的方法,以及无需停下来阅读50页内容的所有示例。每个问题的一个例子和几个段落。

票数 0
EN

Stack Overflow用户

发布于 2013-01-12 18:06:09

在类中有一个setter方法

代码语言:javascript
复制
public class ThreadTest implements Runnable {
    ....
    public void setPressedList(ArrayList<Integer> e) {
       this.pressed = e;
    }
    public void setReleasedList(ArrayList<Integer> f)
    {
       this.released = f
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-01-12 18:18:12

ArrayList并不是线程安全的,因此您不应该以这种方式使用它们:它可以工作,也可能失败。

此外,您应该使用某种synchronization机制,而不是繁忙等待的,后者可以免费使用资源。

因此,请看一下BlockingQueue集合,它将在线程之间提供一个简单的数据传递机制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14295991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档