【问题标题】:Pass and get value from functions running in multithreading in java从 java 中的多线程中运行的函数传递和获取值
【发布时间】:2015-05-11 02:04:12
【问题描述】:

我正在尝试为五个线程并行运行我的程序。我正在使用可运行接口的运行功能。这就是我的代码现在的样子:

class RunnableDemo implements Runnable {
private Thread t;
private String val;

RunnableDemo(int a, int b){
   val1=a;
   val2=b;
}
public void run () 
{
  int sum =0;
  sum= val1 + val2;
}
public void start ()
{
  if (t == null)
  {  
     t = new Thread (this, val1, val2);
     t.start ();
  }
}
}

 public class Parallel_execution {
 public static void main(String args[]) {  
  int x=2
  int i=0;
  for (i=0;i<5; i++){
      RunnableDemo R = new RunnableDemo(x,i);
      R.start();
      }
   }
   }

我想获取所有线程的总和值,并在其他函数中再次使用它。线程中运行的函数如何返回值?如何访问这些值?

【问题讨论】:

  • sum作为类的属性并在run方法中初始化计算值,使用join等待所有线程计算sum然后循环遍历所有线程和getSum()
  • 删除了多余的部分,为了清晰起见重新措辞,修改了语法。

标签: java multithreading runnable


【解决方案1】:

runnable 接口的run() 方法不会返回void,但您可以在方法外部定义sum 变量:

class RunnableDemo implements Runnable {
/...
int sum =0;
//public getter and setter (getSum,setSum)
public void run () 
{
  sum= val1 + val2;
}
//...
}

现在您可以轻松访问它:

 public class Parallel_execution {
 public static void main(String args[]) {  
  int x=2
  int i=0;
  for (i=0;i<5; i++){
      RunnableDemo R = new RunnableDemo(x,i);
      R.start();
      System.out.println(R.getSum());
      }
   }
   }

【讨论】:

  • 您的示例显示了对RunnableDemo.start() 的调用,但它没有显示声明的任何此类方法。不知道你是不是想说new Thread(new RunnableDemo()).start()
  • 另外,假设R.start() 应该启动一个线程,那么您的main() 方法会立即查找该值,而无需先等待线程计算它。
  • 只是看问题,我没有把所有代码都带进来,(//...),我只是带来了变化
  • 没错。我关于不等待线程计算结果的评论仍然存在。 @PriyalJain 当线程需要相互通信时,它们必须同步。在这种情况下,由于 run() 方法不循环,因此 main() 例程可以通过 join()ing 每个线程在查看线程计算的结果之前与工作线程同步。
  • 当然在java多线程中的同步和其他一些概念的情况下,有问题的代码有很多问题,但我认为这是一种做法,问题所有者在这一步中没有使用它们(正如他/她所说:我是 Java 新手)我只是不想让它变得更难一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2012-08-16
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多