首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Runnable转换为runnable Worker数组

将Runnable转换为runnable Worker数组
EN

Stack Overflow用户
提问于 2020-10-21 00:53:06
回答 1查看 154关注 0票数 1

我正在尝试创建一个存储worker类的runnable数组,然后使用Thread数组开始工作。

代码语言:javascript
复制
public class SimpleThreads {
  public static void main(String[] args) {
    System.out.println("main starts.");

    int num1 = 5;
    int num2 = 7;

    // create Workers
    Runnable r1 = new Worker(num1, num2);
    Runnable r2 = new Worker(num1 * 10, num2 * 10);
    
    Runnable[] runs = new Worker(num1, num2);

    // create Threads to run Workers

    Thread[] threads = new Thread[args.length];

    for (int i = 0; i < args.length; i++) {

      threads[i] = new Thread(runs[i]);
    }

    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    // start threads
    t1.start();
    t2.start();
    // Returns the adition to the main
    System.out.println(((Worker) r1).doCalc());
    System.out.println(((Worker) r2).doCalc());

    int grandTotal = 0;

    grandTotal = ((Worker) r1).doCalc() + ((Worker) r2).doCalc();
    System.out.println("The Grand Total " + grandTotal);

    System.out.println("main ends.");
  }
}

/*
 * the class that becomes a thread, can be named anything, must have
 * "implements Runnable" which requires the public void run() method
 */
class Worker implements Runnable {
  private int val1;
  private int val2;
  private long threadId;

  // constructor
  Worker(int val1, int val2) {
    this.val1 = val1;
    this.val2 = val2;
  }

  // required method
  public void run() {
    threadId = Thread.currentThread().getId();
    doCalc();
  }

  // does the actual work
  public int doCalc() {
    return val1 + val2;

    // System.out.printf("[%03d] %3d + %3d = %3d\n", threadId, val1, val2, result);
  }
}

基本上,有人能帮我找出我哪里做错了吗?我收到此错误:类型不匹配:无法从Worker转换为Runnable[]Java(16777233)

我的预期结果应该是

创建一个可运行的工作进程数组

然后将可运行的工作线程数组与线程数组一起使用,并自动启动线程,而不是逐个硬编码每个线程。

EN

回答 1

Stack Overflow用户

发布于 2020-10-21 01:22:13

看起来你在概念上有点混乱。

您将所有线程和可运行对象存储在数组中,然后继续创建非数组实例并使用这些实例。声明runnables和线程,然后直接从主线程调用计算方法。

让我们先清理启动部分:

代码语言:javascript
复制
public class SimpleThreads {
  public static void main(String[] args) {
    System.out.println("main starts.");

    int num1 = 5;
    int num2 = 7;

    // Build an array of workers.
    Worker[] workers = new Worker[] {
      new Worker(num1, num2),
      new Worker(num1 * 10, num2 * 10)
    };

    // create Threads to run Workers and start them
    Thread[] threads = new Thread[workers.length];

    for (int i = 0; i < workers.length; i++) 
    {
      threads[i] = new Thread(workers[i]);
      threads[i].start();
    }

所以,现在我们有了一个Worker数组和一个Thread数组。如果愿意,您可以将workers数组声明为Runnable类型,但我们希望稍后使用worker的方法。

让我们看看我们是否能从工人那里获得数据。我们将添加一个getResult()方法。

代码语言:javascript
复制
class Worker implements Runnable {
  private int val1;
  private int val2;
  private int result;

  // constructor
  Worker(int val1, int val2) {
    this.val1 = val1;
    this.val2 = val2;
  }

  // required method
  public void run() {
      doCalc();
  }

  // does the actual work
  private void doCalc() {
     result = val1 + val2;
  }

  public int getResult() { return result; }
}

因此,一旦我们的worker完成,我们就可以调用getResult()来查看它的最终答案是什么。

所以,回到主要部分,让我们等待线程完成,然后将结果相加。

代码语言:javascript
复制
int grandTotal = 0;

// Wait for threads to finish
for(int i=0;i<threads.length;i++)
{
    threads[i].join();
}

// Read their results
for (int i=0; i<workers.length;i++)
{ 
    grandTotal += workers[i].getResult();
}
System.out.println("The Grand Total " + grandTotal);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64449825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档