一.多线程的创建
1.thread / runnable
1>继承thread类 并重写run方法
继承Thread启动线程 Thread
2>实现Runnable接口 同时实现run方法
实现Runnable接口 启动线程 Runnable
2.两种启动线程方法的异同点
共同点: 都必须调用Thread产生线程 调用start方法开启线程
不同点: 1>接口比继承Thread更灵活
2> 如果继承Thread类,就必须产生相应多个Thread线程
而实现Runnable接口只需要建立一个实现这个类的实例,然后用这个实例对象产生多个线程,就可以实现整个资源的共享
3.start方法和run方法的区别(开启线程的方法)
start:启动了线程真正实现了多线程执行体,不需要等到run方法执行完毕,就可以执行下面的代码
run:处于就绪状态的,并没有进行运行
run方法其实就是一个线程体,包含了线程主要要执行的内容
run方法结束的话这个线程就终止了
单独调用run方法只会正常顺序执行,没有实现多线程的效果
二.多线程的通信方式
1.synchronized关键字
1>synchronized对象锁
synchronized对象锁2>synchronized实现线程间通信(通过不同的线程,去共享同一个变量,来进行锁的管理)
共享内存通信3>synchronized/volatile
各种修饰符4>synchronized(CPU悲观锁机制,是一个独占的锁意味着其他线程只能依靠阻塞,来等待线程释放锁)/lock(CPU乐观锁机制, 每次不加锁而是假设没有冲突完成木架操作.如果有冲突失败就重试,直到成功为止)
2.sleep / wait
锁
[sleep]在设定的时间内,阻塞线程的执行,但不会改变线程锁的持有情况)[wait]需要锁来控制
3.wait / notify通信机制
锁
[wait]定义在object大量当中,需要在同步代码块当中来调用.调用完之后才会释放锁.并进入锁对象的等待队列
[notify] 需要其他线程来调用此方法释放锁之后他才能去重新竞争这个锁
[notifyAll] 通知所有线程去释放锁
三.线程池
1>好处
1.降低资源消耗(就是说我们可以通过重复利用已经创建的线程,降低线程创建,销毁锁带来的消耗)
2.提高响应速度(当我们的任务达到一定数量程度的时候,不需要等到线程创建就立即执行)
3.提高线程的可管理性(因为线程毕竟还是比较稀缺的资源,尤其是在手机当中.可无限式的创建线程,不仅会消耗系统资源,同时还会降低系统稳定性,使用线程池进行统一分配,这样我们不仅做到了合理利用线程池,同时也提高了我们线程池的管理性)
2>ThreadPoolExecutor
new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,milliseconds,runnableTaskQueue,handler);
corePoolSize:线程池的基本大小
maximumPoolSize:线程池最大容量的线程大小
keepAliveTime:内存活动保存的时间
milliseconds:保证时间的单位
runnableTaskQueue:阻塞队列
ThreadFactory:创建线程的工厂
RejectedExecutionHander:是一个保护策略.(当线程满的时候直接抛出异常)
创建线程池 ---> 提交任务
3>线程池的工作流程
1)首先线程池判断基本线程池是否已满[如果满的话,进行下一个流程.如果没满会创建一个工作线程执行该任务]
2)其次线程池判断工作队列是否已满[如果满的话,进行下一个流程,如果没满我们将提交一个任务存储到该工作队列当中]
3)线程池判断整个线程池是否已满[如果满的话,进行下一个流程,如果没满抛出异常]
网友评论