多线程
一、线程:
是进程中执行运算的最小单位,可完成一个独立的顺序控制流程。
一个进程中至少需要一个线程(主线程)来作为程序入口。
多线程:
如果在一个进程中同时运行了多个线程,用来完成不同的工作。
多线程并不是同步执行,而是交替占有CPU资源
多线程的好处:
>充分利用CPU的资源
>简化编程模型
>带来良好的用户体验
二、Thread类
Thread() 分配新的Thread对象
Thread(Runnable target) 分配新的Thread对象,target为run()方法被调用时的对象
Thread(Runnable target,String name)分配新的Thread对象,target为run()方法被调用时的对象,name为新的线程名称
void run()执行任务操作的方法
void start()使线程开始执行,Java虚拟机调用该线程的run()方法
String getNam()返回线程的名称
int getPriority() 返回线程的优先级
static Thread currentThread() 返回当前正在执行的线程对象的引用
使用一个线程的过程一般可以分为四步:
1)定义一个线程,同时指明这个线程所要执行的代码,即期望完成的功能
2)创建线程对象
3)启动线程
4)终止线程
1)创建线程类有两种方法:继承Thread类和实现Runnable接口。
1.1继承Thread 类创建线程
>继承Thread 类
>重写Thread类的run()方法,编写线程执行体
> 创建线程对象,调用start()方法,启动线程
线程的五种状态:
1.创建状态
2.就绪状态
3.运行状态
4.阻塞状态
5.死亡状态
四、线程的调度
void setPriority(int newPriority) 更改线程的优先级
boolean isAlive() 测试线程是否处于活动状态
void join() 等待该线程中止
void interruput() 中断线程
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
public static void sleep(long millis)在指定的毫秒内让当前正在执行的线程休眠(暂停执行)
五、线程的强制运行
millis:以毫秒为单位的等待时长
nanos:要等待的附加纳秒时长
六、线程的礼让
>暂停当前线程,允许其他具有相同优先级的线程获得运行机会
>该线程处于就绪状态,不转为阻塞状态
Ps:只是提供一种可能,但是不能保证一定会实现礼让。
七、多线程共享数据引发的问题
当多个线程共享同一个资源时。一个线程未完成全部操作的时候,其他线程修改的数据,造成数据不安全问题。
八、线程同步的实现
1.使用synchronized修饰的方法控制对类成员变量的访问
访问修饰符 synchronized 返回类型 方法名(参数列表){}
或
synchronized 访问修饰符 返回类型 方法名(参数列表){}
2。使用synchronized关键字修饰的代码块
//syncObject为需同步的对象,通常为this
效果一样
synchronized(syncObject){
//需要同步的代码
}
3.多个并发线程访问同一资源的同步代码块时
1)同一时刻只能有一个线程进入synchronized(this)同步代码块
2)当一个线程访问一个synchronized(this) 同步代码块时,其他synchronized(this) 同步代码块同样被锁定
3)当一个线程访问一个synchronized(this) 同步代码块时,其他线程可以访问该资源的非synchronized(this) 同步代码
九、线程安全的类型
>ArrayList类的add()方法为非同步方法
>当多个线程向同一个ArrayList对象添加数据时,可能出现数据不一致问题
Hashtable&&HashMap
Hashtable:
>实现Map接口,继承Dictionary类
>线程安全,效率低
>键和值都不允许为null
HashMap:
>实现Map接口,继承AbstractMap类
>非线程安全,效率高
>键和值都允许为null
StringBuffer&&StringBuilder
前者线程安全,后者非线程安全