如何将参数传递给java中已经运行的线程?
如何将参数传递给java中已经运行的线程——而不是在构造函数中&可能不使用wait()(可能??) 类似于中的注释 您的意思是将参数传递给已经运行的线程吗?因为目前所有的答案都是关于将参数传递给新线程的瓦伦丁·罗彻2009年5月18日10:43 [编辑] 是的,我在寻找类似生产者/消费者模式的东西 我想要一个像线程一样的东西,其中有处理&准备好了 用于键盘输入。另一个线程只是监视网络并传递消息如何将参数传递给java中已经运行的线程?,java,multithreading,Java,Multithreading,如何将参数传递给java中已经运行的线程——而不是在构造函数中&可能不使用wait()(可能??) 类似于中的注释 您的意思是将参数传递给已经运行的线程吗?因为目前所有的答案都是关于将参数传递给新线程的瓦伦丁·罗彻2009年5月18日10:43 [编辑] 是的,我在寻找类似生产者/消费者模式的东西 我想要一个像线程一样的东西,其中有处理&准备好了 用于键盘输入。另一个线程只是监视网络并传递消息 将收到的文本发送到处理线程。可能您真正需要的是阻塞队列。创建线程时,您将阻塞队列传入,线程应不断检查队
将收到的文本发送到处理线程。可能您真正需要的是阻塞队列。创建线程时,您将阻塞队列传入,线程应不断检查队列中是否有任何元素。在线程外部,您可以在线程“运行”时将元素放入队列。阻塞队列可以防止线程在无事可做的情况下退出
public class Test {
public static void main(String... args) {
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
Thread running = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
String data = queue.take();
//handle the data
} catch (InterruptedException e) {
System.err.println("Error occurred:" + e);
}
}
}
});
running.start();
// Send data to the running thread
for (int i = 0; i < 10; i++) {
queue.offer("data " + i);
}
}
}
公共类测试{
公共静态void main(字符串…参数){
final BlockingQueue=新建LinkedBlockingQueue();
线程运行=新线程(新可运行(){
@凌驾
公开募捐{
while(true){
试一试{
字符串数据=queue.take();
//处理数据
}捕捉(中断异常e){
System.err.println(“发生错误:+e”);
}
}
}
});
running.start();
//将数据发送到正在运行的线程
对于(int i=0;i<10;i++){
报价(“数据”+i);
}
}
}
另一个线程将有自己的生命周期,因此您无法真正与它通信/向它传递参数,除非它主动读取您提供给它的内容
允许您与其通信的线程通常从某个缓冲队列读取数据
例如,看一看消费者-生产者模式。这样如何:
class TestRun implements Runnable
{
private int testInt = -1;
public void setInt(int i)
{
this.testInt = i;
}
@Override
public void run()
{
while (!isFinishing())
{
System.out.println("Working thread, int : " + testInt);
try
{
Thread.sleep(2500);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
请告诉我们您试图在更高级别上实现什么。只需将线程编码为您首先要做的事情,这样您就不需要通过任何操作。听起来您正在寻找生产者/消费者模式。您真正想要做什么?请提供代码片段或一些详细信息。您是否在线程代码中设置了接收器参数?或者在特定情况下获取线程值的任何其他方法?
TestRun first = new TestRun();
TestRun second = new TestRun();
(new Thread(first)).start();
(new Thread(second)).start();
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
}
first.setInt(101);
second.setInt(102);
public class T1 implements Runnable {
//parameter of thread T1
public static AtomicBoolean flag = new AtomicBoolean();
@Override
public void run() {
}
}
public class T2 implements Runnable {
@Override
public void run() {
//parameter to an already running thread
T1.flag.set(true);
}
}