首页 > 解决方案 > 线程的行为与我认为的相反

问题描述

只需导入随机数并计数。负数 , even_positive , even_negative ; 任务是查看多线程工作减少执行时间;通过)在主函数和多线程中执行相同的任务;

代码 1)
首先我创建了一个实现Runnable. 那个单一的班级完成了所有的计数工作。但是根据我的说法,每个函数(谈论run()方法内部的函数调用)都是在前一个函数结束时执行的,因此甚至应该增加时间,因为我们要循环 3 次以获取相同的数据。但令我惊讶的是,执行时间比简单地计算主函数中的一个循环要少;

代码 2)

在第二种情况下,我创建了 3 个类实现Runnable接口,以便我的所有进程都可以并发,因此应该减少时间。但令我惊讶的是,相反的情况发生了。对于同一任务,它比 main 函数中的单个循环花费更多的时间;

import java.util.Random;

class ThreadClass implements Runnable {
    private int[] random;

    public ThreadClass(int[] a) {
        random=a;
    }

    int neg(int[] random) {
        int nega=0;
        for(int i=0;i<10000;i++) {
            if (random[i] < 0)
                nega++;
        }
        return nega;
    }

    int posiEven(int[] random) {
        int posEven=0;
        for(int i=0;i<10000;i++) {
            if (random[i] > 0){
                if(random[i]%2==0)
                    posEven++;
            }
        }
        return posEven;
    }

    int posiOdd(int[] random) {
        int posOdd=0;
        for(int i=0;i<10000;i++) {
            if (random[i] > 0){
                if(random[i]%2!=0)
                    posOdd++;
            }
        }
        return posOdd;
    }

    @Override
    public void run() {
        System.out.println("negative, positive odd, positive even "+neg(random)+" "+posiOdd(random)+" 
"+posiEven(random));
    }
}   

public class Lab6_Q2 {
    public static void main(String[] args) {
        int[] random = new int[10000];
        Random r = new Random();
        for(int i=0;i<10000;i++){
            random[i]=r.nextInt(201)-100;
        }
        int neg=0,posEven=0,posOdd=0;
        long startTime1 = System.nanoTime();
        for(int i=0;i<10000;i++){
            if(random[i]<0)
                neg++;
            else{
                if(random[i]%2==0)
                    posEven++;
                else
                    posOdd++;
            }
        }
        long endTime1 = System.nanoTime();
        System.out.println("negative, positive odd, positive even "+neg+" "+posOdd+" "+posEven);
        System.out.println("Time taken without using multiple threads: "+(endTime1-startTime1)+" ns");

        ThreadClass threadClass = new ThreadClass(random);
        Thread t1 = new Thread(threadClass);
        long startTime2 = System.nanoTime();
        t1.start();
        long endTime2 = System.nanoTime();

        System.out.println("Time taken  using multiple threads: "+(endTime2-startTime2)+" ns");
    }
}

代码 2)

import java.util.Random;

class Negative implements Runnable
{
private int[] random;
int neg;
public Negative(int[] a)
{
    random=a;
    neg= 0;
}
public void run()
{
    
    for(int i=0;i<10;i++) 
    {
        System.out.println("in_negative");
        if (random[i] < 0)
            neg++;
    }
}
}

class Positive_even implements Runnable
{
    private int random[];
    int pos_even;

public Positive_even(int a[])
{
    random = a;
    pos_even = 0;
    
}
    public void run()

        {
          for(int i=0;i<10;i++) 
          {
              System.out.println("in_pos_even");
                if (random[i] > 0)
                {
                if(random[i]%2==0)
                    pos_even++;
            }
         }
    }
}

class positive_odd implements Runnable
{
    private int random[];
    int pos_odd;

    public positive_odd(int a[])
{
    random = a;
    pos_odd = 0;
}
public void run()
{
      for(int i=0;i<10;i++) 
      {
          System.out.println("in_pos_odd");
            if (random[i] > 0)
            {
                if(random[i]%2 != 0)
                    pos_odd++;
            }
        }
}                                         
}
public class Lab6_Ques2
{
    public static void main(String[] args) 
    {
        int[] random = new int[10];
        Random r = new Random();
        for(int i=0;i<10;i++)
        {
            random[i]=r.nextInt(20)-10;
         }
    int neg=0,posEven=0,posOdd=0;
    long startTime1 = System.nanoTime();
    for(int i=0;i<10;i++){
        if(random[i]<0)
            neg++;
        else{
            if(random[i]%2==0)
                posEven++;
            else
                posOdd++;
        }
    }
    long endTime1 = System.nanoTime();
    System.out.println("negative, positive odd, positive even "+neg+" "+posOdd+" "+posEven);
    System.out.println("Time taken without using multiple threads: "+(endTime1-startTime1)+" ns");
                                                   
    Negative threadClass1 = new Negative(random); 
    Thread t1 = new Thread(threadClass1); 
     
    Positive_even threadClass2 = new Positive_even(random);
    Thread t2 = new Thread(threadClass2);
    
    positive_odd threadClass3 = new positive_odd(random);
    Thread t3 = new Thread(threadClass3);
    
    long startTime2 = System.nanoTime(); 
    t1.start();
    t2.start();
    t3.start();
    long endTime2 = System.nanoTime(); 
                                                                         
    System.out.println("Time taken  using multiple threads: "+(endTime2-startTime2)+" ns");
}
}

标签: javamultithreadingrandomtimerunnable

解决方案


推荐阅读