Java线程出于不清楚的原因创建了额外的线程

时间:2019-01-07 01:37:21

标签: java multithreading

Java线程会创建额外的线程,我不确定为什么会发生这种情况!如果很明显,我仍然对java不满意,对不起,但是请帮帮我

好吧,我创建了2个线程来做某事,但是创建了额外的线程

这是代码

import java.util.*;    
import java.util.Arrays;

class consuming_producing extends Thread {
   static int arrX[] = new int[300];
    int y;
    static int var=0;

    int Request_type;

    consuming_producing(int x, int Request) {
        y = x;
        Request_type = Request;

    }
    int thread_number;
    consuming_producing(int x, int Request ,int thread) {
        y = x;
        thread_number=thread;
        Request_type = Request;

    }



    public synchronized void run() {

        switch (Request_type) {
            case 1: {                                                  
            // start producing the data and store it to the array
                for (int i = y; i < 300; i = i + 3) {
                    arrX[i] = (int) (Math.random() * 10 + 1);
                    System.out.println("produced " + arrX[i]);
                }
            }

            // *******************
            case 2: {                  // consuming the data
                for (int ww = y; ww < y+150;ww++) {
                    int sum = Arrays.stream(arrX).sum();
                    System.out.println("Sum  =" +var+" by thread " + thread_number);
                    //Arrays.fill(arrX,0);
                    var+=1;
                }
            }    
        }
    }
}

class consumer_producer {
    public static void main(String[] args){
        consuming_producing arr_Producer_obj[] = new consuming_producing[3];   
          // create a [enter image description here][1]thread for producing
        for (int i=0;i<3;i++){
            int x  =0;
            arr_Producer_obj[i]=new consuming_producing(x,1);
            arr_Producer_obj[i].start();
            x+=1;
        }

        // ***************
        consuming_producing arr_Consumer_obj[]=new consuming_producing[2];
        int thread=1;  // this is the name of thread im creating for ny refrence
        int x=0;
        for (int i=0;i<=1;i++){
            arr_Consumer_obj[i]=new consuming_producing(x,2,  thread);
            arr_Consumer_obj[i].start();
            x+=150;
            thread+=1;**
        }
    }
}

这是输出图像,请检查

https://i.stack.imgur.com/xRlLp.png

2 个答案:

答案 0 :(得分:0)

每次程序到达Thread.start()方法时,它将创建一个新线程,以及main()方法/入口点的基础线程。 您的main方法有2个for循环,第一个看起来将创建3个线程,第二个看起来将创建2个其他线程。

扩展Thread类并实现'run()'方法时,在该类的实例上调用start()将创建一个新线程以在其上运行'run()'方法。

答案 1 :(得分:0)

好吧,您的代码有很多问题。但是回答您的问题很简单:

您在2个for循环中创建了一堆线程,但是线程之间没有同步\通信点,因此它们的作用独立,即您调用{ {1}}实例将在单独的线程中执行start方法。如果只有在第一个循环中的线程完成执行后才创建第二个循环,程序中就不会阻止任何线程。因此,这里没有创建额外的线程。您只是以错误的方式解决了您的解决方案。