【问题标题】:How to pass parameter to an already running thread in java?如何将参数传递给java中已经运行的线程?
【发布时间】:2012-08-16 11:23:10
【问题描述】:

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

类似于How can I pass a parameter to a Java Thread?中的评论

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

[编辑]

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

我想要一个线程之类的东西,其中有处理和准备就绪 用于键盘输入。另一个线程只是监视网络并通过 将接收到的文本发送到处理线程。

【问题讨论】:

  • 请告诉我们您想要在更高的层次上实现什么。
  • 只需对线程进行编码以首先执行您想做的事情,这样您就不需要传递任何内容。
  • 听起来你在寻找生产者/消费者模式
  • 你真正想做什么?请提供代码 sn-p 或一些详细信息。您是否在线程代码中设置了接收器参数?或任何其他在特定情况下获取线程值的方法?

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      这样的方式怎么样:

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

      【讨论】:

        【解决方案4】:
        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);
            }   
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 2019-03-26
          • 2015-02-12
          • 1970-01-01
          • 2010-10-26
          • 2014-01-05
          相关资源
          最近更新 更多