java并发编程基础1
一.计算机并发编程发展历史
第一阶段:真空管/穿孔打卡时期,这个时期计算机大部分时间都处于空闲状态,等待着数据输入,即卡片穿孔;
第二阶段:晶体管/批处理操作系统:这个时期解决了穿孔打卡的空闲等待,但是只能串行操作,遇到程序有Io操作,就会造成cpu的浪费;
第三阶段:集成电路/多道程序设计:这个时期可以进行进程隔离程序,可以同时运行多个程序,如程序遇到Io操作会切换时间片,cpu运行其他程序,极大的提高了cpu的资源使用率
二:为什么需要线程
1.线程看一看做是轻量级线程,创建和销毁成本更低
2.满足实时性需求,一个程序看做一个进程,很明显一个程序里面需要多个工作流程相互配合,达到实时性的要求
3.计算机从单核进化到多核,一个核心能够调度一个线程,真正意义上达到了并行计算
三:java中如何创建线程
1.继承Thread类,重写run方法,通过start方法来启动线程
2.实现Runnable接口,实现run方法,丢到Thread类里面去执行
3.通过Callable接口/FutureTask类来实现线程,可以得到线程执行的返回值
其实看过源码的都知道,上面3种本质上都一样,FutureTask和Thread都实现了Runnable接口,创建线程的本质还是通过调用操作系统创建一个线程,然后回调运行我们自定义的run方法
四:在项目中的实际运用
多线程在项目中的用处很多,但大多存在于框架源码中,比如:
1.服务器软件的socket处理.
2.服务注册和发现中的定时任务拉取服务配置
3.自定义线程池
五:java线程的生命周期
在java中线程一共有6中状态,详见jdk中Thread类中的内部枚举类State
1.NEW状态:线程创建时的状态
2.RUNNABLE:分为两个阶段,cpu还没有调度该线程的时候为就绪状态,调度了即为运行状态
3.BLOCKED:阻塞状态,多个线程在竞争锁资源时,没有抢到锁的线程即为阻塞状态
4.WAITING状态:调用wait,join,LockSupport.park方法时线程为等待状态
5.TIME_WAITING:调用sleep,wait(t)方法时线程为带时间的等待状态
6.TERMINATED:终止状态,及线程run方法执行完毕后的状态
需要注意的是,除了第一种和第6种,其余的状态皆可转换
六:线程中断和线程复位
thread.interrupt()该方法不能中断线程,只能改变thread.isInterrupted方法的返回值,让程序可以根据这个值进行逻辑处理,该返回值默认是false,调用interrupt()方法后会变成true;
但是如果线程处于阻塞状态,调用interrupt(),会抛出中断异常,此时中断状态会复位,thread.isInterrupted()方法依然会返回false,这样如果要中断线程,就需要在catch里面主动调用中断方法
除了这种被动复位的方式,还可以主动调用Thread.interrupted方法进行改状态的复位

浙公网安备 33010602011771号