7

如何将参数传递给java中已经运行的线程——不在构造函数中,并且可能不使用wait()(可能??)

类似于如何将参数传递给 Java 线程?

您的意思是将参数传递给已经运行的线程吗?因为所有当前的答案都是关于将参数传递给新线程...... – Valentin Rocher 2009 年 5 月 18 日 10:43

[编辑]

是的,我正在寻找类似生产者/消费者模式的东西。

我想要一个类似于线程的东西,其中有处理并准备好键盘输入。另一个线程只是监视网络并将接收到的文本传递给处理线程。

4

4 回答 4

12

也许你真正需要的是阻塞队列。当你创建线程时,你传入阻塞队列,线程应该继续检查队列中是否有任何元素。在线程之外,您可以在线程“运行”时将元素放入队列。如果线程无事可做,阻塞队列可以防止线程退出。

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);
        }
    }
}
于 2012-08-21T06:34:27.900 回答
4

“其他线程”将有自己的生命,因此您无法真正与它通信/将参数传递给它,除非它主动读取您提供给它的内容。

您允许您与之通信的线程通常从某个缓冲队列中读取数据。

看看ArrayBlockingQueue例如,阅读消费者-生产者模式。

于 2012-08-21T06:34:47.557 回答
2
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);
    }   
}
于 2012-08-21T06:44:52.810 回答
0

这种方式怎么样:

    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);
于 2012-08-21T06:38:13.543 回答