1.线程基础
cpu按照资源分配方法分为:分时调度,每个线程占用同样时间;还有个是抢占式调度,按照优先级进行。java使用的是抢占式。
线程是指进程中的一段处理程序。进程是指一个应用程序在cpu中进行单元。
2.什么是多线程?
实现一个以上的程序段的线程,是多线程。多线程实现并发处理,提升CPU的使用率,从而提升处理性能。
现在操作系统都支持并发处理,即多线程。但运行速度都很快且切换频繁,所以多个应用程序看起来都在同时执行。
多线程的五大状态:新建new;可运行runnable(被调用start方法,等待执行);运行running;堵塞blocked(等待堵塞wait方法,等待notify调用;同步堵塞,在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中;其他堵塞:Thread.sleep,t.join导致的超时后放入runnable);死亡Dead。
3.创建线程方法
1⃣️继承Thread类,
重写run方法,方法要写的程序,后调用start方法,来启动该线程,且让jvm调用run方法执行里面程序。
2⃣️继承runnable接口
实现run方法,创建对象后传给Thread类构参对象后,进行调用start方法。
好处:避免单继承,同时减少对象和方法的耦合性。
4.多线程的内存运行机制
多线程执行时,在栈内存中,每一个执行线程都有自己所属的栈内存空间,进行方法的压栈和弹栈。一般都从mian方法(主线程开始),后启动其他线程,则创建一块栈区域。
当执行线程的任务结束,线程自动在栈内存中释放。当所有的执行线程结束,进程也结束。
5.线程池
线程池上多线程的一个容器,帮助管理线程的生命周期。
在创建销毁线程的消耗很大,比发送请求和处理用户请求的时间可能要多。每次jvm会在线程任务结束后,会自动释放内存。而如此反复创建的过程会浪费很多资源。
创建线程对象后,可重复利用,管理其生命周期,对于重复线程不会很快销毁,从而避免重复创建节省资源。
参考链接图:https://www.cnblogs.com/jmsjh/p/7762034.html
6.线程池的创建
线程池一般都是通过工厂类Executors来创建的,常用方法有:
newcachedTreadPool:无界线程池;newFixedThreadPool有界线程池;newSingleThreadExecutor:单一线程池,以队列方式来执行任务;newScheduledThreadPool:定时线程池;corePoolSize线程池核心数量;maximumPoolSize最大数量;keepAliverTime当活跃线程数>核心线程数时,空闲的多余线程最大存活时间;workQueue存放任务的队列。
线程池会不断从workqueue获取任务到线程池执行,当workqueue为空,则堵塞等待。
Callable接口和Runnable接口方式来实现线程池的线程调用;Callable的call方法可返回执行异常。
例:
ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
MyCallable c = new MyCallable(); / MyRunnable r = new MyRunnable();
service.submit(c/r);
service.submit(c/r);
service.submit(c/r);