基本的多线程程序

时间:2017-06-30 18:12:49

标签: java multithreading

以下代码应该从用户获取两个整数(每个输入一个线程),添加它们(使用第三个线程)并打印总和。 但是程序在第一个线程之后终止。

import java.util.Scanner;

public class T1 {

    public static void main(String args[]) {
        num1 oo = new num1();
        num2 t1 = new num2();

        add s = new add();

        int flag = 0;
        if(oo.flag == 0 && flag == 0) {
            oo.start();
            flag = 1;
        }

        if(oo.flag == 1 && flag == 1)
            t1.start();

        if(oo.flag == 1 && t1.flag2 == 1)
            s.start();

    }

}

class num1 extends Thread //implements Runnable
{
    int n1,flag = 0;
    Scanner obj = new Scanner(System.in);

    public void run() {
        System.out.println("enter first no");
        n1 = obj.nextInt();
        flag = 1;

        System.out.print("In num1 and flag is " + flag + "\n");
    }

}

class num2  extends Thread {
    int n2,flag2 = 0;
    Scanner obj = new Scanner(System.in);

    public void run() {
        System.out.println("enter second no");
        n2 = obj.nextInt();
        flag2 = 1;
        System.out.print("In num2 and flag is " + flag2 + "\n");
    }

}

class add extends Thread {
    public void run() {
        num1 o = new num1();
        num2 t = new num2();

        System.out.print("The sum is " + (o.n1 + t.n2) + "\n");
    }

}

输出它给出:

enter first no
5
In num1 and flag is 1

2 个答案:

答案 0 :(得分:1)

即使您使用join()(正确的事情),您的代码仍然无法按照您的意图运行。你的主线程创建了一个num1和一个num2线程,它们都提示用户输入(这会引起下面提到的另一个问题)然后创建一个add线程,它自己创建新的{ {1}}和num1个线程,它们会再次询问用户输入。因此,您将要求用户输入4次,前2次将是多余的。

如果这个程序是一个学习练习,那么忽略你从中学到的东西(除了需要使用num2)。您不应该从多个线程收集用户输入,而应该在主线程上收集输入并将其传递给其他线程。

除此之外,另一个问题是您创建了多个包裹join()的{​​{1}}个对象。永远不要使用Scanner创建多个System.in对象。有关Stack Overflow问题的更多信息:Java Multiple Scanners

答案 1 :(得分:1)

您提供的代码存在以下问题:

  • 通过System.in类引用/打开Scanner的多个实例。它会产生问题,因为单个对象(System.in)正在多个线程中使用。
  • add.run()中,num1num2线程的实例已创建,但从未启动过。
  • 未使用join()连接线程,因此如果public static void main(String args[])被终止,则线程也会被终止。另外线程num1 onum12 t应该在求和之前连接提升值o.n1t.n2,以便可以正确读取相应的值。
  • public static void main(String args[])中,num1 oonum2 t1已创建。但它的值不能用于run()add方法的求和。所以逻辑错误

以下是更正后的代码(出于优化原因,将删除未使用的变量):

import java.util.Scanner;

class T1 
{
    public static Scanner obj = new Scanner(System.in);
    public static void main(String args[]) {
        add s = new add();
        try{
            s.start();
            s.join();
        }catch(Exception ex){}
    }
}

class num1 extends Thread {
    int n1;
    public void run() {
        System.out.println("enter first no");
        n1 = T1.obj.nextInt();
        System.out.print("In num1 is " + n1 + "\n");
    }
}

class num2  extends Thread {
    int n2;
    public void run() {
        System.out.println("enter second no");
        n2 = T1.obj.nextInt();
        System.out.print("In num2 is " + n2 + "\n");
    }
}

class add extends Thread {
    public void run() {
        num1 o = new num1();
        num2 t = new num2();
        o.start();
        t.start();
        try {
            o.join();
            t.join();
        }catch(Exception ex){}

        System.out.print("The sum is " + (o.n1 + t.n2) + "\n");
    }
}