如何将参数传递给java中已经运行的线程?

如何将参数传递给java中已经运行的线程?,java,multithreading,Java,Multithreading,如何将参数传递给java中已经运行的线程——而不是在构造函数中&可能不使用wait()(可能??) 类似于中的注释 您的意思是将参数传递给已经运行的线程吗?因为目前所有的答案都是关于将参数传递给新线程的瓦伦丁·罗彻2009年5月18日10:43 [编辑] 是的,我在寻找类似生产者/消费者模式的东西 我想要一个像线程一样的东西,其中有处理&准备好了 用于键盘输入。另一个线程只是监视网络并传递消息 将收到的文本发送到处理线程。可能您真正需要的是阻塞队列。创建线程时,您将阻塞队列传入,线程应不断检查队

如何将参数传递给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);
    }   
}