我正在尝试创建一个存储worker类的runnable数组,然后使用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)
我的预期结果应该是
创建一个可运行的工作进程数组
然后将可运行的工作线程数组与线程数组一起使用,并自动启动线程,而不是逐个硬编码每个线程。
发布于 2020-10-21 01:22:13
看起来你在概念上有点混乱。
您将所有线程和可运行对象存储在数组中,然后继续创建非数组实例并使用这些实例。声明runnables和线程,然后直接从主线程调用计算方法。
让我们先清理启动部分:
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()方法。
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()来查看它的最终答案是什么。
所以,回到主要部分,让我们等待线程完成,然后将结果相加。
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);https://stackoverflow.com/questions/64449825
复制相似问题