如何在Java中向已运行的线程传递参数?

7
如何向Java中已经运行的线程传递参数——不是在构造函数中传递,并且可能不使用wait()(可行吗?)。类似于How can I pass a parameter to a Java Thread?中的评论。
你是指向已经运行的线程传递参数吗?因为所有当前的答案都是关于向新线程传递参数... - Valentin Rocher May 18 '09 at 10:43
[编辑]
是的,我正在寻找像生产者/消费者模式这样的东西。
我想要的是一个具有处理功能并准备好接收键盘输入的线程。另一个线程只是监视网络并将接收到的文本传递给处理线程。

请告诉我们您在更高层面上试图实现什么。 - Jon Skeet
1
只需编写线程以执行您最初想要执行的操作,这样您就不需要传递任何内容。 - David Schwartz
1
听起来你正在寻找生产者/消费者模式。 - MadProgrammer
你到底想做什么?请提供一个代码片段或一些细节。你在 Thread 代码中是否设置了接收器参数?或者是否有任何其他方法可以获取特定情况下线程的值? - Jayant Varshney
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);
        }
    }
}

4
"其他线程"有它自己的生命周期,所以你不能真正与它通信/传递参数,除非它主动读取你提供给它的内容。
允许你与之通信的线程通常从某个缓冲队列中读取数据。
例如,看一下ArrayBlockingQueue,并了解消费者-生产者模式。

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);
    }   
}

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接