Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基本多线程程序_Java_Multithreading - Fatal编程技术网

Java 基本多线程程序

Java 基本多线程程序,java,multithreading,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();

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

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
即使您使用了
join()
(正确的操作),您的代码仍然无法按预期的方式运行。主线程创建一个
num1
和一个
num2
线程,这两个线程都会提示用户输入(这会引发下面提到的另一个问题),然后创建一个
add
线程,该线程本身会创建新的
num1
num2
线程,这将再次请求用户输入。因此,您将要求用户输入4次,前2次是多余的

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


除此之外,另一个问题是在系统中创建多个
扫描仪
对象。切勿使用
系统创建多个
扫描仪
对象。在
中,切勿。有关此堆栈溢出问题的更多信息:

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

  • 通过
    Scanner
    类引用/打开
    系统中的多个实例。它会产生问题,因为单个对象(
    System.in
    )正在多个线程中使用
  • add.run()
    中,创建了
    num1
    num2
    线程的实例,但从未启动
  • 线程不是使用
    join()
    连接的,因此如果
    public static void main(String args[])
    被终止,那么线程也会被终止。另外,在对值
    o.n1
    t.n2
    求和之前,线程
    num1 o
    num12 t
    也应该连接起来,以便能够正确读取相应的值
  • publicstaticvoidmain(字符串args[])
    中,创建了
    num1oo
    num2t1
    。但是它的值不能用于在类的
    add
    run()
    方法中求和。因此,这在逻辑上是不正确的
以下是更正的代码(出于优化原因,删除了未使用的变量):


程序终止是因为主线程终止(在线程上使用
join()
使其等待)。您的主线程必须等待其他线程完成。如何使主线程不终止?检查一下(编辑成一个SO链接,而不是一个充满广告的站点)只是一个注释,但是大写你的类名是一个很好的做法
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");
    }
}