Java实现主进程等待其他进程

Java实现主进程等待其他进程

大多采用多路复用模型,最后由主线程进行数据汇总,分支线程进行接口调用,数据库查询等耗时操作

使用Future并发

Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

  • 代码
package Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolTest {

    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<Integer> submit1 = executorService.submit(() -> ThreadPoolTest.trySleepInt());
        Future<Integer> submit2 = executorService.submit(() -> ThreadPoolTest.trySleepInt());
        Future<Integer> submit3 = executorService.submit(() -> new Integer("9"));
        System.out.println(1);
//      这里要是不用get会不进入阻塞状态,主程序直接向下执行
        System.out.println(submit1.get());
        System.out.println(2);
        System.out.println(submit2.get());
        System.out.println(submit3.get());
        System.out.println(3);
        executorService.shutdown();
    }


    public static int trySleepInt(){
        try {
            Thread.sleep(5000L);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 10;
    }

}

  • 输出
1
10
2
10
9
3

使用CountDownLatch

CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。
CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。

  • 代码

import java.util.concurrent.CopyOnWriteArrayList;

import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;

public class demo01 {
    public static void main(String[] args) throws InterruptedException {
        //子线程每调用一次countDown,这个数值便会减一
        CountDownLatch countDownLatch = new CountDownLatch(3);


        ArrayList<Runner> runners = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Runner runner = new Runner(countDownLatch);
            runner.start();
            runners.add(runner);
        }

        System.out.println("ready?");
        //当CountDownLatch的计数器到0的时候会继续往下执行
        countDownLatch.await();
        System.out.println("Go!");
    }
}

class Runner extends Thread {

    private final CountDownLatch countDownLatch;

    public Runner(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000 * 5);
        } catch (InterruptedException e) {
            System.out.println("Error " + e.getMessage());
        }
        System.out.println(Thread.currentThread().getName() + " had ready! Waiting other runners.");
        countDownLatch.countDown();
        System.out.println(Thread.currentThread().getName() + " GO!");
    }
}
  • 结果
ready?
Thread-2 had ready! Waiting other runners.
Thread-0 had ready! Waiting other runners.
Thread-0 GO!
Thread-1 had ready! Waiting other runners.
Thread-2 GO!
Go!
Thread-1 GO!

##参考
https://www.cnblogs.com/Lee_xy_z/p/10470181.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 进程调度是操作系统的重要概念之一,Java作为一种面向对象的编程语言,可以通过多线程来实现进程调度。 在Java,可以通过使用Thread类和Runnable接口来实现进程调度。可以创建多个线程对象,并使用线程调度器对这些线程进行管理和调度。线程调度器可以根据不同的调度算法来选择哪个线程执行。 下面是一个简单的Java程序,实现进程调度: ``` public class ProcessScheduler { public static void main(String[] args) { // 创建多个线程对象 Thread t1 = new Thread(new MyRunnable("Process 1")); Thread t2 = new Thread(new MyRunnable("Process 2")); Thread t3 = new Thread(new MyRunnable("Process 3")); // 启动线程 t1.start(); t2.start(); t3.start(); } static class MyRunnable implements Runnable { private String name; public MyRunnable(String name) { this.name = name; } @Override public void run() { System.out.println("Running " + name); try { // 模拟进程执行 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Finished " + name); } } } ``` 在这个程序,我们创建了三个线程对象,并使用Runnable接口实现进程执行的逻辑。在main函数,我们启动了这三个线程,线程调度器会根据不同的算法来选择哪个线程执行。当线程执行完毕后,会输出相应的提示信息。 ### 回答2: 进程调度是操作系统一个重要功能,用于决定哪个进程将获得CPU的使用权。在Java,可以使用多线程来实现进程调度。 首先,创建一个进程调度器类,里面包含一个进程队列,用于存储所有需要调度的进程。可以使用ArrayList来实现进程队列。 接着,创建一个进程类,包含进程的ID、优先级和执行时间等属性。可以使用一个线程来代表一个进程。 在进程调度器类,可以设置一些调度算法,如先来先服务(FCFS)、最短作业优先(SJF)、优先级调度等等。根据不同的算法,可以对进程队列进行排序,使得优先级高的进程获得CPU的使用权。 在主程序,可以创建一定数量的进程,并将它们添加到进程队列。根据进程调度算法的不同,可以选择不同的调度策略来决定下一个执行的进程。可以使用一个死循环来模拟进程的执行和调度过程,直到所有进程都执行完毕。 在执行过程,需要考虑进程的状态转换,如就绪状态、运行状态和完成状态等。可以使用线程的start()方法来启动每一个进程的执行,使用join()方法来等待进程执行完毕。 进程调度的实现还需要考虑同步和互斥问题。可以使用锁、信号量或者条件变量等机制来保证进程的正确执行。 总之,使用Java实现进程调度需要创建进程调度器类和进程类,并设置合适的调度算法。通过多线程来模拟进程的执行和调度过程,同时考虑同步和互斥机制,确保进程正常执行。 ### 回答3: 进程调度是操作系统的重要功能之一,它负责决定进程的执行顺序和分配系统资源。通过使用Java编写程序,我们可以实现一个简单的进程调度模拟器。 首先,我们需要定义一个进程类,包含进程的ID、优先级和执行时间等属性。我们可以使用Java的类来表示进程,如下所示: ```java class Process { private int id; private int priority; private int executionTime; public Process(int id, int priority, int executionTime) { this.id = id; this.priority = priority; this.executionTime = executionTime; } // getter and setter methods // ... } ``` 然后,我们可以创建一个进程调度器类,用于实现进程的调度逻辑。进程调度器在每个时间片根据一定的调度算法选择下一个要执行的进程一个简单的进程调度器例子如下: ```java class ProcessScheduler { private List<Process> processList; public ProcessScheduler() { processList = new ArrayList<>(); } public void addProcess(Process process) { processList.add(process); } public void schedule() { while (!processList.isEmpty()) { // 根据一定的调度算法,选择下一个要执行的进程 Process nextProcess = selectNextProcess(); // 执行进程 System.out.println("Process " + nextProcess.getId() + " is running."); nextProcess.execute(); // 将执行完的进程进程列表移除 processList.remove(nextProcess); } } private Process selectNextProcess() { // 根据一定的调度算法,选择下一个要执行的进程 // 这里可以根据进程的优先级或其他指标进行选择 // 这里仅作为示例,假设选择第一个进程执行 return processList.get(0); } } ``` 最后,我们可以编写测试代码来模拟进程的创建和调度过程: ```java public class Main { public static void main(String[] args) { // 创建进程调度器 ProcessScheduler scheduler = new ProcessScheduler(); // 创建进程 Process process1 = new Process(1, 2, 10); Process process2 = new Process(2, 1, 5); Process process3 = new Process(3, 3, 8); // 将进程添加到进程调度器 scheduler.addProcess(process1); scheduler.addProcess(process2); scheduler.addProcess(process3); // 调度进程 scheduler.schedule(); } } ``` 上述代码创建了一个进程调度器,并创建了三个进程,并将它们添加到调度器。然后调度器会根据调度算法选择下一个要执行的进程,并将执行完的进程进程列表移除。 这个简单的进程调度器只是一个示例,实际情况我们可能需要更复杂的调度算法和更多的进程属性来实现一个真实可用的进程调度器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值