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

如何运行一个有4个线程的程序,并一次运行一个线程,或者在第一个线程完成后运行一个线程

段干安和
2023-03-14

我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。

但是我希望数字被乘以或相加等。由用户选择。

也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。

import java.util.Scanner;

//-------------------------------------------------------------------
// Clasa pentru inmultire numerelor  /
//----------------------------------/
class theMultiplicationTable {
    void printNumber(int n) {
        synchronized (this) {
            Scanner multiplai = new Scanner(System.in); // Create a Scanner object
            System.out.println("Enter a number to be multiplai");
            n = multiplai.nextInt(); // Read user input
            System.out.println("\n---------------------------");
            System.out.println("Table of Multiplication " + n);

            for (int i = 1; i <= 10; i++) {
                System.out.println(n + " * " + i + " = " + (n * i));
                try {
                    Thread.sleep(400);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    }
}

class MyThread1 extends Thread {
    theMultiplicationTable inmultire;

    MyThread1(theMultiplicationTable inmultire) {
        this.inmultire = inmultire;
    }

    @Override
    public void run() {
        inmultire.printNumber(7);
    }
}

// -------------------------------------------------------------------
// Clasa pentru impartirea numerelor /
// ---------------------------------/
class divisionBoard {
    void printNumber(float n1) {
        synchronized (this) {
            System.out.println("\n---------------------------");
            System.out.println("Table of Division Board " + n1);
            for (int i = 1; i <= 10; i++) {
                System.out.println(n1 + " / " + i + " = " + (n1 / i));
                try {
                    Thread.sleep(400);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    }
}

class MyThread2 extends Thread {
    divisionBoard impartirea;

    MyThread2(divisionBoard impartirea) {
        this.impartirea = impartirea;
    }

    @Override
    public void run() {
        impartirea.printNumber(7);
    }
}

// -------------------------------------------------------------------
// Clasa pentru adunarea numerelor /
// -------------------------------/
class assemblyBoard {
    void printNumber(int n3) {
        synchronized (this) {
            System.out.println("\n---------------------------");

            System.out.println("Table of Assembly Board " + n3);
            for (int i = 1; i <= 10; i++) {
                System.out.println(n3 + " + " + i + " = " + (n3 + i));
                try {
                    Thread.sleep(400);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    }
}

class MyThread3 extends Thread {
    assemblyBoard adunarea;

    MyThread3(assemblyBoard adunarea) {
        this.adunarea = adunarea;
    }

    @Override
    public void run() {
        adunarea.printNumber(7);
    }
}

// -------------------------------------------------------------------
// Clasa pentru scaderea numerelor /
// -------------------------------/
class decreaseTable {
    void printNumber(int n4) {
        synchronized (this) {
            System.out.println("\n---------------------------");
            System.out.println("Table of Decrease table " + n4);
            for (int i = 1; i <= 10; i++) {
                System.out.println(n4 + " - " + i + " = " + (n4 - i));
                try {
                    Thread.sleep(400);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    }
}

class MyThread4 extends Thread {
    decreaseTable scaderea;

    MyThread4(decreaseTable scaderea) {
        this.scaderea = scaderea;
    }

    @Override
    public void run() {
        scaderea.printNumber(7);
    }
}

public class Invi {
    public static void main(String args[]) throws InterruptedException {
        theMultiplicationTable obj = new theMultiplicationTable();
        MyThread1 t1 = new MyThread1(obj);
        t1.start();
        divisionBoard obj2 = new divisionBoard();
        MyThread2 t2 = new MyThread2(obj2);
        MyThread2.sleep(5000);
        t2.start();
        assemblyBoard obj3 = new assemblyBoard();
        MyThread3 t3 = new MyThread3(obj3);
        MyThread3.sleep(5000);
        t3.start();
        decreaseTable obj4 = new decreaseTable();
        MyThread4 t4 = new MyThread4(obj4);
        MyThread3.sleep(5000);
        t4.start();

    }
}

共有1个答案

单于俊智
2023-03-14

你的问题不清楚。显然你想从用户那里得到一位数的输入,然后为四个数学运算(加、减、乘、除)中的每一个建立一个结果表。

你的标题说创建四个线程,然后一次运行一个。这没有意义。我们使用线程一次运行多个活动。一次只运行一个线程违背了线程的目的。所以我假设你心里有其他意思,仍然是个谜。

在现代Java中,我们很少需要直接处理线程类。相反,使用添加到Java5中的Executors框架

将四项任务中的每一项定义为RunnableCallable。如果要从任务中收集结果,请使用Callable。将用户选择的数字作为参数传递给每个函数的构造函数。

创建executor服务,例如Executors。newCachedThreadPool()。通过调用invokeAll提交四项任务。你会得到一个未来对象的列表。每个Future都是您对每个任务的状态和结果的控制。

按照Javadoc中的示例代码,在您的执行器服务上调用关闭等待终止

然后检查Future对象,看看它们是否都成功了,如果您使用了Callable,则收集结果。

所有这些都已经在堆栈溢出中多次讨论过了。因此,搜索以了解更多信息,并查看示例代码。

 类似资料:
  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 我用的是Netty camel-Netty:jar:2 . 10 . 0 . red hat-60024。下面是我对Netty监听器的配置 荨麻:tcp://10.1.33.204:9001?textline=true 在这里,我看到基于调试日志,Netty只创建一个工作线程,所以传入的消息被阻塞,直到现有的消息被处理。 喜欢: 2014-08-23 12:36:48,394|DEBUG|w I/

  • 问题内容: 我们在JMS使用者中使用ThreadPoolExecutor,并将其注入DefaultMessageListenerContainer中。我希望这会在许多消息上运行并发线程,但是我们的日志显示线程ID不会改变,而我们的日志显示对于不同的消息处理,线程ID始终为24。 在这种情况下,这是spring配置: 在不将threadPoolExectuor Bean注入DefaultMessag

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?

  • 我如何启动两个线程,其中thread1首先执行,thread2在thread1结束时启动,而主方法线程可以在不锁定其他两个线程的情况下继续工作? 我尝试了join(),但是它需要从线程调用,线程必须等待另一个线程,没有办法执行类似thread2.join(thread1)的操作;因此,如果我在main()中调用join,我将有效地停止主线程的执行,而不仅仅是Thread2的执行。 #编辑:为什么我

  • 这里我用java开发。 我有一个for循环中的线程,我想连续运行5次。不幸的是,循环在第二次运行时停止,出现了一个错误: 异常在线程"main"java.lang.IllegalThreadStateExctive在java.base/java.lang.Thread.start(Thread.java:793) 我知道这个错误是什么意思,但是我要求他在确定完成线程时恢复循环,这样就不会有任何错误