如何将参数传递给java中已经运行的线程——不在构造函数中,并且可能不使用wait()(可能??)
您的意思是将参数传递给已经运行的线程吗?因为所有当前的答案都是关于将参数传递给新线程...... – Valentin Rocher 2009 年 5 月 18 日 10:43
[编辑]
是的,我正在寻找类似生产者/消费者模式的东西。
我想要一个类似于线程的东西,其中有处理并准备好键盘输入。另一个线程只是监视网络并将接收到的文本传递给处理线程。
如何将参数传递给java中已经运行的线程——不在构造函数中,并且可能不使用wait()(可能??)
您的意思是将参数传递给已经运行的线程吗?因为所有当前的答案都是关于将参数传递给新线程...... – Valentin Rocher 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);
}
}
}
“其他线程”将有自己的生命,因此您无法真正与它通信/将参数传递给它,除非它主动读取您提供给它的内容。
您允许您与之通信的线程通常从某个缓冲队列中读取数据。
看看ArrayBlockingQueue
例如,阅读消费者-生产者模式。
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);
}
}
这种方式怎么样:
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);