将Runnable转换为可运行的Worker数组

问题描述

我试图创建一个存储工作者类的可运行数组,然后使用Thread数组开始工作。

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)

我的预期结果应该是

创建一组可运行的工作器

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

解决方法

似乎您在概念上有些困惑。

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

让我们先清理启动部分:

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

因此,现在我们有了一个Workers数组和一个Threads数组。 您可以根据需要将workers数组声明为Runnable类型,但是稍后我们想使用worker的方法。

让我们看看是否可以从工作人员那里获取数据。我们将添加一个getResult()方法。

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

因此,一旦我们的工作人员完成,我们可以调用getResult()来查看其最终答案是什么。

因此,回到主目录,让我们等待线程完成,然后将其结果相加。

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