文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java详解使用线程池处理任务方法

2024-04-02 19:55

关注

什么是线程池?

线程池就是一个可以复用线程的技术。

不使用线程池的问题:

如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。

线程池常见面试题:

1、临时线程什么时候创建?

新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。

2、什么时候会开始拒绝任务?

核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝。

1、线程池处理Runnable任务

import java.util.concurrent.*;
public class 多线程_5线程池处理Runnable任务 {
    public static void main(String[] args) {
        //线程池处理Runnable任务
        //创建线程池对象
        
        ExecutorService pool=new ThreadPoolExecutor(3,5,
                6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
        //给任务线程池处理
        Runnable r=new MyExe();
        //三个核心线程
        pool.execute(r);
        pool.execute(r);
        pool.execute(r);
        //五个任务队列(不创建临时线程时,会发现只有三个线程,即核心线程量)
        pool.execute(r);
        pool.execute(r);
        pool.execute(r);
        pool.execute(r);
        pool.execute(r);
        //创建临时线程(五个线程,即最大线程量)
        pool.execute(r);
        pool.execute(r);
        //不创建,拒绝策略被触发
       // pool.execute(r);
        //关闭线程池(开发中一般不会使用)
//        pool.shutdownNow();//立即关闭,即使任务没有执行完毕。会丢失任务的!
//        pool.shutdown();//会等待任务全部执行完毕后再关闭(建议使用)
    }
}
class MyExe implements Runnable{
    public void run(){
        for (int i = 1; i <=6 ; i++) {
            System.out.println(Thread.currentThread().getName()+"正在执行:"+i+"次");
        }
        //因为当前案例任务太简单,我们需要创建临时队列需要让三个核心线程忙,五个任务队列排满,所以让线程休眠以增加任务时间
        try {
            System.out.println(Thread.currentThread().getName()+"任务与线程绑定,线程进入了休眠");
            Thread.sleep(1000000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、线程池处理Callable任务

import java.util.concurrent.*;
public class 多线程_5线程池处理Callable任务 {
    public static void main(String[] args) throws Exception {
        //线程池处理Callable任务
        //创建线程池对象
        
        ExecutorService pool=new ThreadPoolExecutor(3,5,
                6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
        //给任务线程池处理
//        Callable c=new MyCallable2(100);
//        pool.submit(c);
       Future<String> f1=pool.submit(new MyCallable2(100));
        Future<String> f2=pool.submit(new MyCallable2(200));
        Future<String> f3=pool.submit(new MyCallable2(300));
        Future<String> f4=pool.submit(new MyCallable2(400));
        Future<String> f5=pool.submit(new MyCallable2(500));
//        String str=f1.get();
//        System.out.println(str);
        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());
        System.out.println(f5.get());
    }
}
class MyCallable2 implements Callable<String> {
    //                               v(泛型)
    private int n;
    public MyCallable2(int n) {
        this.n = n;
    }
    //重写call方法
    //案例:加法
    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i <=n; i++) {
            sum += i;
        }
        return Thread.currentThread().getName()+"执行 1-"+n+"的和,结果为:" + sum;
    }
}

到此这篇关于Java详解使用线程池处理任务方法的文章就介绍到这了,更多相关Java线程池内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯