-
线程与进程得关系
一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程
线程则是计算机中最小执行单元. 比如电脑管家这个软件就是一个进程而里面的杀毒 清理垃圾 全局守护这些功能就是一个个线程.一个进程最少拥有一个线程 .
线程的创建方式
一个集成两个实现
集成thread 无返回值
实现runable 无返回值
实现callable 有返回值
线程池 线程池de七大参数
核心线程 最大线程 阻塞队列 线程存活时间 存活时间单位线程工厂 和拒绝策略
线程池de一个执行方式首先任务提交时
先判断是否达到核心先线程数 没到达的话创建一个核心线程来执行任务
如果达到了则判断工作队列是否已经满了 没满的话放到工作队列中
工作队列满了的话则判断是否达到了最大de线程数量没达到则创建一个新的线程来执行任务.
如果最大线程数也满了则执行拒绝策略
拒绝策略一共有四种
2丢弃任务抛出异常(默认) 终止
这仍是线程池的默认策略当任务不能再提交的时候抛出异常 及时反馈给程序的运行状态 . 关键任务推荐使用这样当系统使更大的并发量的时候能够通过异常及时的发现
2丢弃任务部不抛出异常如果线程队列都满的话后续的任务都会被丢弃. 丢弃
如果提交的任务是无关紧要的则可以使用此策略
3第三种丢弃队列最前面的任务 然后重新提交别被拒绝的任务 丢弃老
首先这个策略也会丢弃任务并且是没有异常提示的 基于这个特点是等后续的任务优先级更高的场景
4第四种调用主线程处理该任务 调用运行策略
这个方式的话只要线程池没有关闭就会提交主线程来处理 好处是不会丢弃任务 坏处是效率低有可能阻塞队列 一般用在不允许失败任务得地方.
-
设置这些参数 一般根据任务的场景来设置 考虑到我之前的项目并发量都不是很高一般都是设置 核心50 最大 100 队列长度100保活时间30秒左右
刚创建的线程池是没有线程de根据上面的线程池流程来说得先提交任务才能创建线程.核心线程就是正在处理任务的线程如果达到了最大的线程数那么所有的线程都是核心线程数
一般使用那种方式创建thread和runable之间的区别
我一般使用实现runable
因为java是单继承继承thread的话不利于后面的拓展 然后继承yhread的话是不能实现线程变量的资源共享 runable的话也可以共享也可以补共享
实现runable和callable区别
最大的区别,runnable没有返回值,而实现callable接口的任务线程能返回执行结果 2、callable接口实现类中的run方法允许异常向上抛出,可以在内部处理,try catch,但是runnable接口实现类中run方法的异常必须在内部处理,不能抛出
线程的状态
线程一共有五种状态
新建 就绪 运行 阻塞 死亡这几种
-
运行new 方法就还没调用shatr方法便是新状态
-
运行run方法但cpu还没分配资源这时候便是就绪状态
-
线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
-
此时可以执行yield方法让出线程的cpu使用权
-
阻塞的话就是一般是指线程被锁拦住了
有多种1通过调用wait方法 让线程等待某工作完成
同步阻塞的话一般是代码被synchronize同步时锁他会进入同步阻塞状态
其他阻塞比如seleep或者join发出io请求线程也会进入阻塞状态到等待的时时间到了或者join终止超时或者io处理完毕线程就重新转入就绪状态等待cpu的分配资源
-
死亡的话表示线程已经执行完毕或者异常退出了该方法