JAVA线程池的使用

作用:

减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存

 

1、newCachedThreadPool

 

1、解释:

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。就是一次添加多个任务,长度会变大,会一直新建线程,当没有任务时,空闲线程会被回收,线程池为无限大,当执行第二个任务时第一个任务已经完成。会复用第一个任务的线程,而不是每次新建线程。

 

2、测试Runnable和callable使用线程池

 

1、测试Runnable 使用线程池

 

public class NewCachedThreadPooltest {

 

    @Test

    public void testRunnalbeSubmit(){

 

ExecutorService exec=Executors.newCachedThreadPool();

 

for(int i=0;i<10;i++) {

    exec.submit(new MyRunnable());

}

//关闭线程池

exec.shutdown();

 

    }

    

 

class MyRunnable implements Runnable{

    @Override

    public void run() {

        System.out.println(Thread.currentThread().getName());

 

    }

}

 

}

 

1、控制台执行结果,会发现虽然上面开启了10个线程,但是线程其实是有重复使用的,这样就大大节省了资源

 

 

2、测试Callable,有返回值

 

public class NewCachedThreadPooltest {

 

    @Test

    public void testCallSubmit(){

 

ExecutorService exec=Executors.newCachedThreadPool();

 

List<Future<String>> results=new ArrayList<Future<String>>();

 

for(int i=0;i<10;i++) {

      

results.add(exec.submit(new CallableTaskWithResult(i)));

}

//关闭线程池

exec.shutdown();

 

for(Future<String> fs :results) {

try {

System.out.println(fs.get());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

 

    }

    

class CallableTaskWithResult implements Callable<String> {

private int id;

public CallableTaskWithResult(int id) {

this.id=id;

}

 

    @Override

    public String call() throws Exception {

        System.out.println(Thread.currentThread().getName());

        return "id为:"+id;

    }

}

 

}

 

2、控制台执行结果,发现同上面Runnable一样,还是节省了资源

 

 

2、newFixedThreadPool

 

解释:

创建一个固定数目的、可重用的线程池。可控制现场最大并发数,超出的线程会在线程队列中等待

 

1、测试代码

 

public class FixedThreadPoolTest {

    @Test

    public void newFixedThreadPoolTest() throws InterruptedException {

        // 固定线程的数量

        ExecutorService m = Executors.newFixedThreadPool(4);

        

        for (int i = 1; i <= 10; i++) {

            final int count = i;

            m.submit(new Runnable() {

                @Override

                public void run() {

                    System.out.println("线程:" + Thread.currentThread() + "负责了"

                            + count + "任务");

                }

            });

            Thread.sleep(1000);

        }

    }

}

 

2、控制台,会发现只有4个线程被创建了

 

 

3、newScheduledThreadPool:

 

创建一个定长线程池,支持定时及周期性任务执行。

 

4、newSingleThreadExecutor

 

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

5

5、newSingleThreadScheduledExcutor:

 

创建一个单例线程池,定期或延时执行任务。

 

6、使用线程池的风险

 

虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。用线程池构建的应用程序容易遭受任何其它多线程应用程序容易遭受的所有并发风险,诸如同步错误和死锁,它还容易遭受特定于线程池的少数其它风险,诸如与池有关的死锁、资源不足和线程泄漏。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值