多线程基础准备

进程:程序的执行过程,持有资源和线程

线程:是系统中最小的执行单元,同一个进程可以有多个线程,线程共享进程资源

线程交互(同步synchronized):包括互斥和协作,互斥通过对象锁实现,协作是多线程竞争同一资源时用wait和notify配合协作

  需要注意的是互斥和协作的前提是同一资源,如果多个线程之间没有对同一个资源进行竞争,那么不叫线程交互,叫多线程就好了。

线程状态:

创建状态---创建一个新线程

就虚状态---start(),等待cpu资源

运行状态---执行run()方法

阻塞状态---线程暂停,如sleep,wait等触发

终止状态---线程销毁

这些东西都是干货,看起来都很熟悉,但是真正使用的时候会出现各种各样的问题,多写几个ThreadDemo就好了,只是抛砖引玉吧。

线程池

作用:限制系统执行线程的数量

为什么要用线程池:

1,减少线程创建和销毁的次数,线程创建和销毁的消耗的资源和时间也不可忽略,可能创建和销毁的时间大于任务的执行时间呢!一次创建,多次使用。

2,根据系统的承受能力,合理控制线程数量,防止无限不合理消耗内存,使服务器死机,一个线程大概要使用1M的内存。

用到的几个重要的类:

1,Executor---线程池顶级接口,执行线程的工具接口,并非线程池

2,ExecutorService---线程池接口

3,ScheduleExecutorService---和Timer/TimerTask类似,解决任务需要重复执行的问题

4,ThreadPoolExecutor---ExecutorService的默认实现类

5,ScheduleThreadPollExecutor---继承ThreadPoolExecutor的ScheduleExecutorService接口的实现类

常用线程池:

1,SingleThreadExecutor,单线程的线程池,也就是一个线程串行执行全部任务。

2,FixedThreadPool,固定大小的线程池,每次提交一个任务先判断核心线程是否已经满了,没满则创建一个新的线程执行任务,满了判断执行队列是否满了,没满把任务放在执行队列,满了判断线程池是否已经满了,没满创建一个新的线程执行任务,满了交给策略处理,如下图:

    

3,CacheThreadPool,可缓存的线程池,如果线程大小超过了任务需要的线程,就会回收部分空闲线程,当任务量增加时,线程池可以智能的添加新线程来处理任务,对线程的数量不做限制。

4,ScheduleThreadPool,无限大小的线程池,可以定时及周期性执行任务。

ThreadPoolExecutor构造方法参数解释

构造方法

new ThreadPoolExecutor(CORE_POOL_SIZE,  MAXIMUM_POOL_SIZE, KEEP_ALIVE, UNIT, WORK_QUEUE, THREAD_FACTORY);

参数解释

CORE_POOL_SIZE --- 核心线程数

MAXIMUM_POOL_SIZE --- 最大线程数

KEEP_ALIVE --- 大于核心线程数的空闲线程等待新任务的时间

UNIT --- KEEP_ALIVE的时间单位

WORK_QUEUE --- 执行队列

THREAD_FACTORY --- 创建新执行任务的工厂

示例线程池代码:

public class ThreadPoolExample{
private static final int CORE_POOL_SIZE = 3;
private static final int MAXIMUM_POOL_SIZE = 10;
private static final int KEEP_ALIVE = 10; private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<Runnable>(10);
private static final ThreadFactory THREAD_FACTORY = new ThreadFactory() {
public Thread newThread(Runnable r) {
return new Thread(r);
}
};
private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, WORK_QUEUE, THREAD_FACTORY);
//提交任务
public void submitTask(Runnable r){
WORK_QUEUE.add(THREAD_FACTORY.newThread(r));
//执行排在首位的任务
THREAD_POOL_EXECUTOR.execute(WORK_QUEUE.poll());
} public static void main(String[] args) {
Runnable r = new Runnable(){
public void run(){
System.out.println("线程开始。。");
}
};
//调用
new ThreadPoolExample().submitTask(r);
} }

公司不用线程池,就先这样简单的理解一下吧~

java线程池初步理解的更多相关文章

  1. 干货,阿里P8浅谈对java线程池的理解(面试必备)

    线程池的概念 线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免创建过多线程来减少系统资源消耗和竞争,确保任务有序完成:ThreadPoolExecutor ...

  2. Java线程池初步解读

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 几个月前,写了一篇<Java并发学习(一):进程和线 ...

  3. java线程池ThreadPoolExecutor理解

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

  4. Java线程池详解(二)

    一.前言 在总结了线程池的一些原理及实现细节之后,产出了一篇文章:Java线程池详解(一),后面的(一)是在本文出现之后加上的,而本文就成了(二).因为在写完第一篇关于java线程池的文章之后,越发觉 ...

  5. Java线程池的底层实现与使用

    前言 在我们进行开发的时候,为了充分利用系统资源,我们通常会进行多线程开发,实现起来非常简单,需要使用线程的时候就去创建一个线程(继承Thread类.实现Runnable接口.使用Callable和F ...

  6. 深入理解Java线程池:ScheduledThreadPoolExecutor

    介绍 自JDK1.5开始,JDK提供了ScheduledThreadPoolExecutor类来支持周期性任务的调度.在这之前的实现需要依靠Timer和TimerTask或者其它第三方工具来完成.但T ...

  7. 深入理解 Java 线程池

    一.简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建 ...

  8. 由浅入深理解Java线程池及线程池的如何使用

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  9. Java线程池理解及用法

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

随机推荐

  1. RHCA-红帽认证架构师

    OpenStack: 向部署应用 配置域.数据源子系统.中实施应用安全 迁移应用至 介绍集群 考试代码 任选其中五门: (红帽企业虚拟化) (红帽企业部署和系统管理) (红帽企业服务器硬化) (红帽企 ...

  2. 服务器控件中使用<%#...>, JS和html控件中使用<%=...>

    //在服务器控件的属性中,需要用<%#...>来绑定其他控件的ID, 并且要在页面初始方法中,执行Page.DataBind(); <asp:ImageButton ID=" ...

  3. chrome浏览器调用 ajax 提示net::ERR_INCOMPLETE_CHUNKED_ENCODING问题解决方案,以及 Response.Close 和 Response.End 的一些问题。

    近段时间去了一家新公司任职,公司产品是一个网站,但是我发现它不兼容谷歌浏览器,用习惯了chrome的我简直是如鲠在喉.终于我抽出了时间,想纠正这个问题.F12一看,发现谷歌提示:net::ERR_IN ...

  4. VSS记住用户名和密码

    计算机-属性-高级系统设置-环境变量 新建两个环境变量如下:        SSUSER(VSS的用户名)        SSPWD(VSS的密码)

  5. BZOJ1801:[Ahoi2009]chess 中国象棋

    Time Limit: 10 Sec  Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置 ...

  6. m.jd.com首页中的js效果

    m.jd.com中的部分js效果 昨天把m.jd.com的首页布局写好了,今天写一下首页中部分js效果.头部背景色透明度的改变,焦点图轮播,京东快报的小轮播,以及秒杀倒计时.这里html,css样式就 ...

  7. 浅谈Java 8的函数式编程

    函数式编程语言是什么? 函数式编程语言的核心是它以处理数据的方式处理代码.这意味着函数应该是第一等级(First-class)的值,并且能够被赋值给变量,传递给函数等等.(转载自http://xz.p ...

  8. UI设计趋势:渐变设计风格重新回归主流

    在扁平化设计刚刚兴起之时,渐变是设计师们避之不及的设计手法,然而今天它已经正式回归.几乎是在一夜之间,无数的网站开始使用渐变色. 从背景到图片上的色彩叠加,包括UI元素上所遮盖的色彩,所有的这一切都表 ...

  9. android隐藏底部虚拟键Navigation Bar实现全屏

    隐藏底部虚拟键Navigation Bar实现全屏有两种情况 第一种:始终隐藏,触摸屏幕时也不出现 解决办法:同时设置以下两个参数 View.SYSTEM_UI_FLAG_HIDE_NAVIGATIO ...

  10. NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)

    具体细节可以参考另外一篇随笔! 以下提供的算法完成的事: 1.自适应1280x720分辨率以下的屏幕 2.自适应1280x720分辨率以上的屏幕 在我设定的要求内包括的分辨率大部分都测过了,背景图.全 ...