多线程基础知识

线程
单线程的程序----只有一条顺序执行流
多线程的程序----有多条顺序执行流


多个顺序流之间互不干扰,多个线程之间互不干扰,java对线程进行了抽象,提供了线程类,我们可以通过多种方法来创建线程,
线程的并发行:多个线程可以在处理器上并发运行,并且相互之间互不影响
多个线程装载处理机上被轮换执行,

 

【操作系统中真是执行情况】

操作系统可以同时执行多个任务,每个任务就是一个进程,进程可以同时执行多个任务,每个任务就是线程,操作系统能独立运行的基本单位是线程,也就是说,操作系统上宏观管理的是进程,但在实际执行的时候,执行的是线程

【宏观理解什么是多线程】

即一个应用程序(应用进程)可以同时执行多个动作,比如浏览器,可以同时并发下载多张图片,一个web服务器可以同时响应多个用户的请求,每一个java虚拟机进程本身都提供了一个垃圾回收线程,

我们明白了什么是多线程并发:java通过对线程抽象,允许我们利用程序做出多个线程对象,多个线程对象的执行体被处理机轮转执行,线程之间互不影响

我们明白了为什么多线程并发下会造成数据不安全:线程有自己的局部变量,有自己的堆栈,但他不拥有系统资源,他与父进程的其他线程间共享该进程所占有的全部系统资源,正因如此是,在多个线程轮换执行的情况下如果操纵的是同一系统资源,才容易出现数据不安全的状况,

java对线程的支持

1创建线程的方法

一个java应用程序-----对应一个java虚拟机进程,这个虚拟机进程里默认只有一个main主线程,主线程默认是前台线程,主线程的执行体默认就是main方法体,还有一个后台线程,即垃圾回收线程,所以说垃圾回收线程执行的时间不固定嘛

继承Thread类,重写run()方法,子类实例即为线程,多个线程之间不能共享线程子类的实例变量

实现Runnable接口,重写run()方法,实现类的实例作为Thread的target来创建Thread对象,Thread对象为线程,多个线程间可以共享线程类的实例变量,线程负责执行其target的run()方法,即多个线程可以共享同一个target,多个线程可以共享实现类的实例变量

实现Callable接口,重写call()方法,使用FutureTask类包装Callable实例,使用FutureTask实例作为Thread对象的target来创建线程,

其中使用实现Runnable和Callable接口的方法非常适合多个相同线程来处理同一份资源的情况,因为线程之间共享实现类的变量

 

2线程的启动

线程子类或者线程类实例化后,该线程就处于新建状态,线程对象被java虚拟机分配了内存,且进行了初始化的操作

调用Thread类的start()方法,线程启动,。。。。。。。线程慢慢由新建态转换为就绪态runnable,java虚拟机会为其创建程序计数器,栈,堆,等待获得处理机

线程获得处理机,此时线程处于运行状态,run

线程处于运行态之后,线程在如下情况下进入阻塞太,并在满足条件之后,从运行态变为阻塞太,从阻塞态变为就绪态

(1)线程调用sleep()方法,经过了指定时间,从阻塞态变为运行态

(2)线程调用了阻塞式IO方法已经返回,从阻塞态变为运行态

(3)线程成功的获取到了同步监视器,从阻塞态变为运行态

(4)线程正在等待某个通知时,其他线程发出了一个通知,从阻塞态变为运行态

(5)线程调用了suspend()方法,调用了resume()恢复方法,从阻塞态变为运行态

(6)线程调用了join()方法,该线程获得处理机,另外一个线程处于阻塞态,该线程执行完,另外一个线程就绪,获得处理机

从运行态变为就绪态

(1)线程失去处理机资源时,线程进入就绪态

(2)线程调用yield()方法,线程进入就绪态

线程死亡

(1)线程体执行完毕

(2)线程抛出error/exception

(3)线程调用了stop方法

线程同步

就是当两个线程同时并发修改同一变量时,就会出现异常,java呢是如何解决多线程的并发带来的数据不一致的问题的呢?

java的多线程引入了同步监视器来解决这个问题,

同步监视器:通常推荐使用可能被并发访问的共享资源充当同步监视器,

对共享资源-----------------------------加锁------------------------------------修改--------------------------释放锁

任何时刻只有一个线程可以获得对同步监视器的锁定,当同步方法执行完成后,该线程会释放对该同步监视器的锁定

对于同步方法,无需显示指定同步监视器,同步方法的同步监视器是this,即调用该方法的对象

通过同步方法可以实现线程安全的类,其中不可变类总是线程安全的,但是可变类需要使用同步方法来控制其线程安全,但并不是对其所有方法发都进行同步,而是对哪些带有修改共享资源的方法发进行同步、

线程执行了wait()方法,当前线程会释放同步监视器,线程调用了sleep()和yield()方法是,不会释放同步监视器

线程池

当程序中,需要创建大量生存期很短暂的线程失,可以考虑使用线程池,减少创建线程对象的成本

线程池在java虚拟机进程启动时就创建大量空闲的线程,程序只需传给线程池一个runnable/callable对象即可,线程池就会启动一个线程来执行他们的run/call方法,只是call/run的方法结束了之后,线程不会死亡,而是再次返回线程池变为空闲状态,

java对线程池的支持

Executors工厂类,可以用来产生线程池,ForkJoinPool

可以利用Collections类来包装线程不安全的类

java同时还提供了一些线程安全的集合类------------------java.util.concurrent包下,

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值