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");
}
}