如何为task1、task2、task3 class run()方法中的threadarray变量赋值?

kq4fsx7k  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(284)

我要在整数threadarray数组中指定指定范围的随机数。
在这些代码中,给出了三个任务。第一个任务和第二个任务同时开始执行线程,在前两个任务完成后,只有第三个任务开始执行。如果这些情况正确,那么test()方法返回true。
public static final int[]threadarray=新int[300];如何使用task1 task2和task3类将随机数添加到这些数组中。
输入:
80
130
90
输出:
是的

import java.util.Scanner;

   class Task1 extends Thread
   {
    static int a = 0;
    static int beg = 0;

    public void run() 
    {
        for(int i=a;i<=beg;i++)
        {
            Solution.threadArray[i] = i;  
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }   
     }
   }

   class Task2 extends Thread
   {
     static int a = 0;
     static int beg = 0;

    @Override
    public void run() 
    {
        // TODO Auto-generated method stub
        for(int i=a;i<=beg;i++)
        {
            Solution.threadArray[i] = i;
        }   
     }

   }

   class Task3 extends Thread
   {
    static int a = 0;
    static int beg = 0;
    public void run() 
    {
        // TODO Auto-generated method stub
        for(int i=a;i<=beg;i++)
        {
            Solution.threadArray[i] = i;
        }   
     }

   }

   public class Solution 
   {
      public static final int[] threadArray = new int[300];

    public static volatile String i = 0+"";

    public boolean test() throws InterruptedException
    {
        Task1 task1 = new Task1();
        Task2 task2 = new Task2();
        Task3 task3 = new Task3();
        Thread task2Thread = new Thread(task2);
        Thread task3Thread = new Thread(task3);
        task1.start();
        task2Thread.start();
        task1.join();
        task2Thread.join();
        task3Thread.start();
        int first = Task1.a+Task2.a;
        int containsSecondThread = Task1.a;
        String oneAndTwo = "";
        String sizeOfTask1 = "";
        for(int i=0;i<first;i++)
        {
            oneAndTwo += threadArray[i]+" ";
        }
        for(int i=0;i<containsSecondThread;i++)
        {
            sizeOfTask1 += threadArray[i]+" ";
        }
        int begOfTask3 = Task3.beg;
        String checkingString = "";
        for(int i=begOfTask3;i<threadArray.length;i++)
        {
            checkingString += i + " ";
        }
        String task3String = "";
        for(int j = begOfTask3;j<threadArray.length;j++)
        {
            task3String += threadArray[j]+" ";
        }
        if((!oneAndTwo.contains(begOfTask3+"") && sizeOfTask1.contains(Task2.beg+"")) || task3String.equals(checkingString))
        {
            return true;
        }
        return false;
    }

    public static void main(String[] args) throws InterruptedException 
    {
        Scanner sc= new Scanner(System.in);

        Solution solution = new Solution();
        int one = sc.nextInt();
        Task1.a = one;
        Task1.beg = 0;
        int two = sc.nextInt();
        Task2.a = two;
        Task2.beg = one;
        int three = sc.nextInt();
        Task3.a = three;
        Task3.beg = one+two;
        System.out.print(solution.test());
    }
   }
tktrz96b

tktrz96b1#

首先,一些关于代码的观察:不要在类中使用静态变量(例如。, Task1 , Task2 ,和 Task3 )扩展了课堂 Thread (为了理解为什么静态变量被认为是邪恶的?):

static int a = 0;
static int beg = 0;

使用非静态final字段,并通过构造函数初始化它们:

class Task1 extends Thread
{
    private final int begin;
    private final int end;

    Task1(int begin, int end){
        this.begin = begin;
        this.end = end;
    }

     public void run(){
        for(int i=begin; i<= end; i++)
           ....
    }
}

调整 main 相应的方法:

public static void main(String[] args){
       ...
       Task1 task1 = new Task1(begin, end);
}

然后将与任务相关的对象作为的参数传递给 test 方法:

public boolean test(Task1 task1, Task2 task2, Task3 task3){ 
      ...
}

对于字符串的串联使用 StringBuilder :

StringBuilder oneAndTwo = new StringBuilder();
for(int i=0;i<first;i++)
{
    oneAndTwo.append(threadArray[i]).append(" ");
}

这看起来不对:

Task1.a = one;
    Task1.beg = 0;

通过观察 run 方法来自 Task1 ,这意味着,如果 Task1.a 不是负数 Task1 不会做任何工作。
使用 threads 要生成数组的随机值: int[] threadArray = new int[300]; 您可以从提取方法开始,根据以下公式生成这些随机值:

r.nextInt(high-low) + low;

此公式生成一个介于 low 以及 high .
相应地调整任务:

class Task1 extends Thread
{
    private final Random random_values = new Random();
    private final int low;
    private final int high;
    ...

    public int generate_random(){
           return r.nextInt(high-low) + low;
    }

    public void run()
    {
        for(....)
        {
            Solution.threadArray[i] = generate_random();
            ...
        }
    }
}

确保向线程传递有关要生成的随机值范围的信息(即 low 以及 high 参数),以及对将用这些随机值填充的数组的引用(即数组) int[] threadArray ) . 还要确保分割迭代 int[] threadArray 在线程之间。因此,每个线程应该生成一个随机值块。这种分配的一个例子是:

Thread 1 : 0 to 100;
Thread 2 : 100 to 200;
Thread 3 : 200 to 300;

您可以使其更健壮,将数组长度除以线程数,并相应地在线程之间分配功。
我本可以给你提供完整的解决方案,但我觉得如果我给你一些建议,这样你就可以自己做了。

相关问题