线程池的流程控制

x33g5p2x  于2022-05-08 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(350)

一 需求

创建一个线程池,线程池中的线程数量固定为本机 CPU 核数,要求通过线程池实现以下需求:

1 向此线程池中提交2个任务,每个任务依次执行以下操作:记录当前线程的启动时间,随机休眠2秒以内,打印当前线程名,返回当前线程名。

2 这两个任务不会立刻执行,而是等待一段时间(10s以内)后再执行。

3 本程序中,Main 线程会和线程池中处理这两个任务的子线程同时执行。在这两个子线程正在执行提交的任务的同时,Main 线程会尝试获取这两个线程的结果,如果这两个子线程还没执行完则提示“未完成”,否则提示“已完成”并打印线程的返回值。

二 实战

1 ThreadTask

package concurrent.myexecutor;

import java.util.concurrent.Callable;

public class ThreadTask implements Callable<String> {
    private String tname;

    public ThreadTask(String tname) {
        this.tname = tname;
    }

    @Override
    public String call() throws Exception {
        // 获取当前线程的名字
        String name = Thread.currentThread().getName();
        long currentTimeMillis = System.currentTimeMillis();
        System.out.println(name + " - 【" + tname + "】 启动时间:" + currentTimeMillis);
        // 模拟线程执行...
        Thread.sleep((long) Math.random() * 2000);
        System.out.println(name + " - 【" + tname + "】 正在执行...");
        return name + " - 【" + tname + "】";
    }
}

2 TestPool

package concurrent.myexecutor;

import java.util.ArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TestPool {
    public static void main(String[] args) throws Exception {
        Future<String> result;
        ScheduledExecutorService schedulPool = Executors.newScheduledThreadPool(4);
        ArrayList<Future<String>> results = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            /*
             * schedule(a,b,c)三个参数的含义:
             * a:向线程池中提交的任务;
             * b:该任务等待多长时间之后,才会被执行
             * c:b的时间单位
             */
            result = schedulPool.schedule(new ThreadTask("thread" + i), (int) (Math.random() * 10), TimeUnit.SECONDS);
            // 存储各个线程的执行结果
            results.add(result);
        }
        // 打印结果
        for (Future<String> res : results) {
            System.out.println(res.isDone() ? "已完成" : "未完成");
            System.out.println("等待线程执行完毕后,返回的结果: " + res.get());
        }
        schedulPool.shutdown();
    }
}

三 测试结果

未完成
pool-1-thread-1 - 【thread0】 启动时间:1651928342584
pool-1-thread-1 - 【thread0】 正在执行...
等待线程执行完毕后,返回的结果: pool-1-thread-1 - 【thread0】
未完成
pool-1-thread-2 - 【thread1】 启动时间:1651928343579
pool-1-thread-2 - 【thread1】 正在执行...
等待线程执行完毕后,返回的结果: pool-1-thread-2 - 【thread1】

相关文章