线程池的好处:

  避免我们过多的去new线程,new是占资源的(GC主要堆内存)

  提高效率

  避免浪费资源

  提高响应速度

作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接使用

前提:AB线程在同一个线程池里面;A线程执行完毕了,B线程进来了,就直接去替换原来A线程的run方法,执行B

使用newCachedThreadPool创建线程池

package com.cppdy;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; class MyThread20 implements Runnable { @Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-线程运行开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-线程运行结束");
}
} public class ThreadDemo20 { public static void main(String[] args) throws Exception {
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,如无可回收,则新建线程
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
Thread.sleep(500);
newCachedThreadPool.execute(new Thread(new MyThread20(),"线程1"));
}
//释放线程池
newCachedThreadPool.shutdown();
} }

使用newFixedThreadPool创建线程池

package com.cppdy;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; class MyThread21 implements Runnable { @Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-线程运行开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-线程运行结束");
}
} public class ThreadDemo21 { public static void main(String[] args) throws Exception {
// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Thread.sleep(500);
newFixedThreadPool.execute(new Thread(new MyThread21(), "线程1"));
}
// 释放线程池
newFixedThreadPool.shutdown();
} }

使用newScheduledThreadPool创建线程池

package com.cppdy;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; public class ThreadDemo22 { public static void main(String[] args) throws Exception {
// 创建一个定长线程池,支持定时及周期性任务执行
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 10; i++) {
final int temp = i;
newScheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("i:" + temp);
}
}, 3, TimeUnit.SECONDS);
}
// 释放线程池
newScheduledThreadPool.shutdown();
} }

使用newSingleThreadExecutor创建线程池

package com.cppdy;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; class MyThread23 implements Runnable { @Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-线程运行开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "-线程运行结束");
}
} public class ThreadDemo23 { public static void main(String[] args) throws Exception {
// 创建一个单线程的线程池,它只会用唯一的工作线程来执行任务
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
Thread.sleep(500);
newSingleThreadExecutor.execute(new Thread(new MyThread21(), "线程1"));
}
// 释放线程池
newSingleThreadExecutor.shutdown();
} }

CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务

IO密集型时,大部分线程都阻塞,故需要多配置线程数,2*cpu核数

java多线程快速入门(二十二)的更多相关文章

  1. java多线程快速入门(十二)

    在静态方法上面加synchonizd用的是字节码文件锁 package com.cppdy; class MyThread8 implements Runnable { private static ...

  2. java多线程快速入门(十八)

    Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...

  3. java多线程快速入门(十五)

    使用violate关键字解决了变量的可见性问题(volatile让多线程刷新falg的值) package com.cppdy; class MyThread11 extends Thread { / ...

  4. java多线程快速入门(十四)

    使用atomicInteger解决了原子性问题(AtomicInteger保证每次只能一个线程操作count) package com.cppdy; import java.util.concurre ...

  5. java多线程快速入门(十九)

    如何停止线程 1.使用stop方法强行终止线程(这个方法不推荐使用,可能会出现业务操作未执行完,线程中断了) package com.cppdy; class MyThread15 extends T ...

  6. java多线程快速入门(十六)

    ThreadLocal关键字实现每个线程有自己的变量 package com.cppdy; class Number { private int num; public static ThreadLo ...

  7. java多线程快速入门(十)

    synchonizd解决安全性问题 package com.cppdy; class MyThread6 implements Runnable{ private Integer ticketCoun ...

  8. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  9. java 多线程 快速入门

    ------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...

  10. Java多线程和并发(十二),Java线程池

    目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...

随机推荐

  1. easyui 进阶之表单校验、自定义校验

    前言 easyui是一种基于jQuery的用户界面插件集合,它为创建现代化,互动,JavaScript应用程序,提供必要的功能,完美支持HTML5网页的完整框架,节省网页开发的时间和规模.非常的简单易 ...

  2. 快速安装nginx

    1.创建nignx用户 /usr/sbin/groupadd -f nginx /usr/sbin/useradd -g nginx nginx 2.安装依赖 yum install gcc gcc- ...

  3. Vue中的双向数据绑定简单介绍

    1. 文本框绑定v-module <div id="app"> <input type="text" v-model="msg&qu ...

  4. window 编译lua 5.3

    由于lua 5.1 不支持左移右移的操作符,所以要移植lua 5.3.方便在window 下编译调试 参考链接: http://www.linuxidc.com/Linux/2014-02/96459 ...

  5. Python 12 - Mysql & ORM

    本节内容 1.数据库介绍 2.mysql数据库安装使用 3.mysql数据库基础 4.mysql命令 5.事务 6.索引 7.Python操作mysql 8.ORM sqlalchemy了解 数据库介 ...

  6. shell编程 之 实践出真知(代码实例)

    1,在任意一个文件夹里,新建10个空文件,文件名为t1.txt-t10.txt ,文件内容分别是11-20 ,就一行,然后把这个10个文件命名成t1.sh-t10.sh. 老司机版: $ for (( ...

  7. PHP Tp5.0 PHPExcel 导出操作

    1.导出 excel 方法 2.导出方法(简单快速)

  8. 【转】MySQL-Select语句高级应用

    [转]MySQL-Select语句高级应用 1.1 SELECT高级应用 1.1.1 前期准备工作 本次测试使用的是world数据库,由mysql官方提供下载地址: https://dev.mysql ...

  9. 关于CactiEZ自定义气象图的配置

    作者:邓聪聪 主要目录: Weathermap主目录:/var/www/html/plugins/weathermap 图片目录(包含背景图标文件):/var/www/html/plugins/wea ...

  10. Alpha 冲刺 (3/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺3 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 组织第一次团队编程 继续阅读小程序开发文档 接下来的 ...