何为进程?
资源分配的最小单元,(资源包括:表格,内存空间,磁盘空间)同一进程中的多条线程讲共享该进程中的资源何为线程
CPU调度的最小单元,线程只有相关堆栈中的寄存器和线程控制表组成,而寄存器可被用来存储线程内的局部变量线程安全是指什么?
只有单例模式下共享全局变量才会导致线程不安全问题锁
分为隐式锁和显示锁;Synchronized是隐式锁,加在对象上的。显示锁:lock,需要手动开关,使用灵活Concurrent包
1)原子性操作类,不需要Synchronized关键字,线程安全效率高
2)线程队列,Java提供了一些线程安全的队列操作的类
3)线程阀,控制线程的开始和结束线程池
1、解决频繁创建线程所产生的开销,减少创建和销毁线程所花的时间和资源消耗
2、解决无限制的创建线程所引起的系统崩溃
3、Executors提供了4种创建线程池的方法
ExcutorService pool = Excutors.newFixedThreadPool(5);//创建一个可重用固定线程数的线程池
#单任务线程池
ExcutorService pool = Excutors.newSingleThreadExcutor();
#可变尺寸的线程池
ExcutorService pool = Excutors.newCachedThreadExcutor();
#定时以及周期性执行任务的线程池
ScheduledThreadPoolExecutor exec = Executors.ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable() {
publicvoid run() {
.....每隔一段时间就触发的线程内容
}
}, 1000, 5000,TimeUnit.MILLISECONDS);
线程池的理解(摘自网络)
这里要重点解释一下corePoolSize、maximumPoolSize、largestPoolSize三个变量。
corePoolSize在很多地方被翻译成核心池大小,其实我的理解这个就是线程池的大小。举个简单的例子:
假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务。
因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;
当10个工人都有任务在做时,如果还来了任务,就把任务进行排队等待;
如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招4个临时工人进来;
然后就将任务也分配给这4个临时工人做;
如果说着14个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。
当这14个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的。
这个例子中的corePoolSize就是10,而maximumPoolSize就是14(10+4)。
也就是说corePoolSize就是线程池大小,maximumPoolSize在我看来是线程池的一种补救措施,即任务量突然过大时的一种补救措施。
不过为了方便理解,在本文后面还是将corePoolSize翻译成核心池大小。
largestPoolSize只是一个用来起记录作用的变量,用来记录线程池中曾经有过的最大线程数目,跟线程池的容量没有任何关系。应用场景
Servlet 我们java开发最基本的东西,其启动的时候其实是开辟了一个main线程的。而其中servlet类是单例的所以它是线程不安全的,但是在没有共享全局变量的情况,而reqest和response是一个请求是一个实例,而其本身的数据设计又是线程安全的。Tomcat Servlet的容器tomcat其实是对线程的线程池做了控制的。提高请求处理效率和避免请求太多把容器弄挂。
Spring 默认加载bean的方式是单例的,所以其是线程不安全的。
数据库连接池,其实也是多线程。
nginx 前端网关请求,也是利用了线程池的原理。
而我们的客户端ios,android其实也都是有主线程和子线程的说法,如果你能很好的将器里面的线程掌握基本上此种客户端开发就能掌握一半。