【问题标题】:How to return Value from Multi Threading? [duplicate]如何从多线程返回值? [复制]
【发布时间】:2016-01-09 11:20:42
【问题描述】:

我的问题是,我只想从多次并发运行的 4 个线程中的多线程返回值。每次线程调用和运行时,我都需要一个返回值。请证明我的理由,谢谢,我的代码 sn-p 看起来像这样,线程1:我正在调用 java 到本机库函数,函数返回整数值。

 public void run() {
            double time = System.currentTimeMillis();
            println("Thread-1 starts " + time);
            ED emot = new ED();
            emot.edetect("str");
            try {
              Thread.sleep(1);
            } catch {

            }
            println("Value: " + emot.getvalue);
            i = emot.getvalue;
                }

【问题讨论】:

  • 所以你想在最后返回 i 吗?您想在哪里使用该值?
  • 使用 Future 和 ExecutorService
  • @SinePike 是的,我想将那个“i”值用于另一个类,但线程运行多次

标签: java multithreading java-native-interface native


【解决方案1】:

据我所知,您有 4 个线程在计算后返回一些值。以下是一些想法:

  1. 如果您的线程返回一些结果,请使用Callable<V>,否则使用Runnable
  2. 您可以使用ExecutorService 提交您的任务(线程),根据是Callable 还是Runnable,您将获得Future<V>Future<?>
  3. 如果您想接收所有线程的结果,您可以提交所有线程并获取期货,然后调用future.get,它会阻塞直到收到结果。如果您想从任何线程接收结果,那么在这种情况下,您也可以使用ExecutorCompletionService,它会按照接收到的任何顺序维护一个结果队列。

【讨论】:

    【解决方案2】:

    在多线程环境中,我们可以使用Executer Service从线程返回值。 JDK 5 提供此功能。

    http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html

    例子:

    public class MyThread implements Callable{
    
        @Override
        public String call(){
            Thread.sleep(2000);
            return "Hello";
        }
    
        public static void main(String args[]){
              ExecutorService executor = Executors.newFixedThreadPool(5);
              Callable<String> callable = new MyThread();
              String value = executor.submit(callable);
              System.out.println("The returned value is : "+value);
              executor.shutdown();
        }
    
    }
    

    这是您可以从线程返回值的方式。

    【讨论】:

      【解决方案3】:

      你可以让那个对象 emot 成为一个类变量。这样,当您在主线程中创建新对象时,您可以通过 getter 方法访问该值。

      public static void main(String[] args) {
          //Your code
      
          YourRunnableClass r = new YourRunnableClass();
          Thread yourThread = r;
          yourThread.start();
      
          //other code
      
          r.getValue() //The value you are trying to get
      }
      
      public class YourRunnableClass implements Runnable {
      
          private ED emot;
      
          public int getValue() {
              return emot.getvalue();
          }
      
          public void run() {
              //Your Code
          }
      }
      

      【讨论】:

      • 我无法分配 YourRunnableClass r = new YourRunnableClass();线程 yourThread = r;类型不匹配无法从 YourRunnableClass 转换为 Thread
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2012-01-23
      • 2021-07-15
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多