多线程的写法

文章展示了Java中使用ExecutorService创建线程池处理并发任务的四种方式,包括固定大小线程池、提交Callable任务、Runnable任务以及结合阻塞队列处理任务。示例涵盖了任务提交、Future结果获取、线程池关闭以及任务处理逻辑。
摘要由CSDN通过智能技术生成

第一种

public static void main(String[] args) {
    ExecutorService executorService = Executors.newFixedThreadPool(2); //线程,有2个厨师

    //下单
    System.out.println("点两个菜");
    long l = System.currentTimeMillis();  //记录一下当前时间
    //结果记录
    HashMap<String, Future<Map<String, String>>> fs = new HashMap<>();
    //提交
    for (int i = 0; i < 10; i++) {    //调用两次
        int finalI = i+1;
        Future<Map<String, String>> future = executorService.submit(new Callable<Map<String, String>>() {
            @Override
            public Map<String, String> call() throws Exception {
                Thread.sleep(5000);  //在做菜,实际业务中不是固定的时长
                HashMap<String, String> map = new HashMap<>();
                map.put("厨师" + Thread.currentThread().getName(), "----做好了");
                System.out.println("thread--");
                return map;
            }
        });
        fs.put("菜" + finalI,future);
    }
    System.out.println(fs);
    //给用户反馈
    if (fs.containsKey("菜1") && fs.containsKey("菜2")){
        //都有了future结果,说明下单成功了
        System.out.println("下单成功,用时:");
        //记录一下用时
        System.out.println(System.currentTimeMillis() - l + "ms");
    }
}

第二种

	public static void main(String[] args) {
    ExecutorService executorService1 = Executors.newFixedThreadPool(10);
    List<Future<Integer>> futures1 = new ArrayList<Future<Integer>>(10);
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");

    for (int i = 0;i<list.size();i++) {
        final int finalI = i;
        Callable<Integer> task2 = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println();

                return 1;
            }
        };
        futures1.add(executorService1.submit(task2));
    }
    executorService1.shutdown();
}

第三种

class MyTask implements Runnable {
    @Override
    public void run() {
        // 执行任务代码
        System.out.println("=========run========");
    }
	}
	public class MapTest {
	    public static void main(String[] args) throws Exception{
	        // 创建一个线程池
	        ExecutorService executor = Executors.newCachedThreadPool();
	        LinkedBlockingQueue<Future<Void>> completionQueue = new LinkedBlockingQueue<>();
	        List<Future<?>> list = new ArrayList<>();
	        // 提交任务给线程池执行
	        for (int i = 0; i < 10; i++) {
	            //list.add(executor.submit(new Runnable() {
	            //    @Override
	            //    public void run() {
	            //
	            //    }
	            //}));
	            executor.submit(new Callable<Void>() {
	                @Override
	                public Void call() throws Exception{

                    return null;
                }
            }).get();
            completionQueue.add(executor.submit(new Callable<Void>() {
                @Override
                public Void call() throws Exception {
                    return null;
                }
            }));
        }

        // 关闭线程池
        executor.shutdown();
        //for(Future<?> future:list){
        //    future.get();
        //}
        System.out.println("=========end========");
    }
}

第四种

public class ExecutorServiceExample {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小为5的线程池
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); // 创建一个容量为10的队列

        // 将任务添加到队列中
        for (int i = 1; i <= 20; i++) {
            try {
                queue.put(i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 提交任务到线程池
        for (int i = 0; i < 5; i++) {
            executor.submit(() -> {
                try {
                    while (true) {
                        int value = queue.take(); // 从队列中取出任务,如果队列为空则会阻塞
                        processTask(value);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        executor.shutdown(); // 关闭线程池

        // 等待所有任务执行完成后关闭线程池
        if(executor.awaitTermination(5, TimeUnit.SECONDS)){
            System.out.println("所有任务执行完成,线程池已关闭");
        } else {
            System.out.println("等待超时,部分任务可能还在执行,线程池未完全关闭");
            executor.shutdownNow(); // 强制关闭所有任务
        }
    }

    private static void processTask(int value) {
        System.out.println("处理任务: " + value);
        // 此处添加处理任务的逻辑
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抱树我第一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值