多线程的定义:
一个程序运行即一个进程,一个进程可以有多个线程,多线程并非多个线程并行在CPU中,而是多个线程分别占据CPU不同的时间段,交替执行,顺序与优先级有关。
线程类:
Thread类
得到主线程对象:
Thread t=Thread.currentThread();
创建线程类方式:
①继承Thread类、重写run()方法(线程的执行体,执行的内容)
优点:编写简单,便于直接操作,适用于单继承
②实现Runnable接口、实现run()方法、【作为Thread类的参数被使用】
优点:避免单继承局限性、便于共享资源
启动线程:
start()方法,使用之后处于等待CPU分配时间段的就绪状态,分配到之后开始运行为运行状态
线程状态:
①创建状态:未调用start()方法之前,可以修改线程信息、内容
②就绪状态:调用start()方法之后,等待获取CPU片段,转为运行状态
③运行状态:因等待文件、用户输入、线程休眠等,随时可能转为阻塞状态因释放CPU,转入就绪状态
④阻塞状态:阻塞解除,立刻转入就绪状态
⑤死亡状态:线程自然执行完毕,或外部干涉终止线程,转入死亡状态
线程调度的常用方法:
更改优先级:setPriority(int类型数字,代表优先级高低,1最低,10最高)
Thread.MAX_PRIORITY【最高优先级】
Thread.MIN_PRIORITY【最低优先级】
休眠方法:【静态】sleep(long类型,表示休眠时间,单位毫秒)
强制暂停:join()【加队,强制暂停其他线程,等调用此方法的线程执行完毕,才能继续执行,有重载带 参的方法】
线程礼让:yield()【静态,暂停当前线程,允许其他相同优先级的线程获得运行机会,当前线程转为就绪 状态,不转为堵塞状态,只提供一种可能,不保证一定礼让成功】
中断线程:interrupt()
线程检查:isAlive()【测试线程是否处于活动状态】
线程不安全:
当多个线程共享同一资源时,一个线程未完成操作的时候,其他线程修改数据,会造成数据不安全问题。
线程同步:
同步方法:使用synchronized修饰的方法进行对类成员变量的访问。相当于上一把锁,当前线程操作未 完成时,其他线程不得进入。
同步代码块:synchronized(syncObject){}与同步方法类似,将可能引起线程不安全的代码片段用sync hronized的关键字修饰,syncObject为需同步的对象,一般为this。
注意:同一时刻,只能有一个线程访问synchronized(this)代码块,其他线程的synchronized(this)代码块 处于锁定状态,但其他线程可以访问非synchronized(this)代码块,此特性也适用于同步方法。
死锁:
两个线程都在等待对方先完成,造成程序的停滞。
产生条件:
两个或两个以上的线程在活动。
某个线程拿到一个锁以后,还想拿第二个锁,造成锁的嵌套。
线程安全类型:
方法是否同步 | 效率比较 | 使用场景 | |
---|---|---|---|
线程安全 | 是 | 低 | 多线程并发共享资源 |
非线程安全 | 否 | 高 | 单线程 |
线程间通信:
Object类中有关于线程操作的方法,wait()和notify()。
wait():挂起当前线程,并释放共享资源锁
notify():随机使一个因调用该对象wait()方法挂起的线程解除阻塞,但需要等到获得锁才能执行。
可以在其子类中直接调用:super.wait();、super.notify();
线程池:
线程池所在的包:java.util.concurrent
顶级接口:Executor
真接口:ExecutorService
实现类:AbstractExecutorService
注:java.util.concurrent.Executors类,提供创建线程池的静态方法。
方法名 | 说明 |
---|---|
newCachedThreadPool(); | 创建一个可缓存的线程池,有任务时才创建新的任务 |
newSingleThreadExecutor(); | 创建一个单线程池 |
newFixedThreadPool(int nThreads); | 创建一个固定长度的线程池,空闲线程会一直保留。参数为线程数 |
newScheduledThreadPool(int corePoolSize); | 创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务 |
自定义线程池:ThreadPoolExecutor类
构造器中各个参数的含义:
corePoolSize:核心池大小
maximumPoolSize:线程池最大线程数
keepAliveTime:表示线程没有任务时最多保持多久时间会终止
unit:参数keepAliveTime的时间单位
workQueue:一个阻塞队列,用来存储等待执行的任务
threadFactory:线程工厂,主要用来创建线程
handler:表示当拒绝处理任务时的策略