以下代码应该从用户获取两个整数(每个输入一个线程),添加它们(使用第三个线程)并打印总和。 但是程序在第一个线程之后终止。
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
答案 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()
中,num1
和num2
线程的实例已创建,但从未启动过。join()
连接线程,因此如果public static void main(String args[])
被终止,则线程也会被终止。另外线程num1 o
和num12 t
应该在求和之前连接提升值o.n1
和t.n2
,以便可以正确读取相应的值。 public static void main(String args[])
中,num1 oo
和num2 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");
}
}