下面的代码应该从用户那里获取两个整数(每个输入一个线程),将它们相加(使用第三个线程)并打印总和。但是程序在第一个线程之后终止。
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
。永远不要使用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是支持多线程的语言之一,它内置了对多线