当前位置: 首页 > 知识库问答 >
问题:

基本多线程程序

顾曾笑
2023-03-14

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

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

共有1个答案

孟乐
2023-03-14

即使您使用join()(正确的操作),您的代码仍然不能按预期的方式运行。主线程创建一个num1和一个num2线程,这两个线程都提示用户输入(这会带来下面提到的另一个问题),然后创建一个add线程,线程本身创建新的num1num2线程,这两个线程将再次要求用户输入。因此,您将要求用户输入4次,前2次将是多余的。

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

除此之外,另一个问题是创建多个scanner对象包装system.in。永远不要使用system,创建多个scanner对象。关于这个堆栈溢出问题的更多信息:Java多个扫描器

 类似资料:
  • 本文向大家介绍Java多线程基本用法总结,包括了Java多线程基本用法总结的使用技巧和注意事项,需要的朋友参考一下 这篇是Java多线程基本用法的一个总结。 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 如何使用多线程 启动线程的两种方式 Java 提供了2种方式来使用多线程, 一种是编写一个类来

  • 问题内容: 以下程序与此处描述的程序基本相同。当我使用两个线程(NTHREADS== 2)运行并编译程序时,得到以下运行时间: 当仅使用一个线程(NTHREADS == 1)运行时,即使仅使用一个内核,运行时间也会明显缩短。 我的系统是双核的,我知道random_r是线程安全的,并且我很确定它是非阻塞的。如果在没有random_r的情况下运行同一程序,并且使用余弦和正弦值的计算作为替换,则双线程版

  • 本文向大家介绍C#多线程编程中的锁系统基本用法,包括了C#多线程编程中的锁系统基本用法的使用技巧和注意事项,需要的朋友参考一下 平常在多线程开发中,总避免不了线程同步。本篇就对net多线程中的锁系统做个简单描述。 目录 一:lock、Monitor      1:基础。      2: 作用域。      3:字符串锁。      4:monitor使用 二:mutex 三:Semaphore 四

  • 本文向大家介绍Java多线程基础——Lock类,包括了Java多线程基础——Lock类的使用技巧和注意事项,需要的朋友参考一下 之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类

  • 我有一个Android应用程序,它由一些本机线程(未连接到JVM)组成,需要能够调用Java对象的方法。 我打算这样做的方式是创建一个JNI函数,我从相关的Java对象调用它,它允许我在静态本机数据结构中获取和缓存所需的java对象方法ID、JNIEnv和对象引用,以便我的本机线程可以(线程安全地)访问所需的方法(例如,使用(*env)- 我不相信这种方法会起作用,因为我读到JNIEnv指针不能在

  • typora-copy-images-to: img 1. 多线程概述 人们在日常生活中,很多事情都是可以同时进行的。例如,一个人可以一边听音乐,一边打扫房间,可以一边吃饭,一边看电视。在使用计算机时,很多任务也是可以同时进行的。例如,可以一边浏览网页,一边打印文档,还可以一边聊天,一边复制文件等。计算机这种能够同时完成多项任务的技术,就是多线程技术。Java是支持多线程的语言之一,它内置了对多线