Java的并发控制
- Java在各个宿主系统上使用同样的多线程编程模型
- 具体的实现委派给了宿主系统的多任务管理模块
因此有两个性质
- Java线程功能集是各个操作系统中的最小公共功能集
- Java线程的性能和表现在各个操作系统上存在细微的差异。
线程的创建
Thread类
public Thread();//构造的默认方法,主要是在继承的时候使用
public Thread(Runnable target);//提供可运行的代码用于线程运行
方法 | 描述 |
---|---|
sleep(long mills) | 休眠当前正在执行的线程 |
start() | 启动线程 |
yield() | 暂停当前正在执行的线程 |
interrupt() | 从等待态中退出 |
setPriority(int newPriority) | 更改线程的优先级 |
继承Thread
继承此类如果需要实现多线程,需要重载run()函数,然后创建子类对象并使用从Thread类继承下来的start()函数,即可启动线程
继承Runable接口
继承Runable接口,然后实现接口里面仅存的run函数,然后使用new Thread(继承了Runable接口的对象的名字).start()来启动线程
线程的生命周期
- 出生态,新线程,刚刚创建,还没有调用start()方法。
- 就绪态,可运行态,线程获得资源,在就绪队列中等待分配CPU资源。
- 运行态,正在运行的线程。
- 阻塞态,线程正在申请等待获取一个锁。
- 等待态,wait()方法在等待一个特定时间的发生。
- 休眠态,线程调用了sleep()方法休眠一段指定的时间,不会释放任何锁资源。
- 死亡态,程序执行结束。
Java线程优先级
一共有10级,从低到高,是1到10,使用setPriority(int newPriority)方法可以设置优先级,使用getPriority()方法可以获取线程的优先级,默认值是5。
Java线程的同步:使用synchronized(同步)来设定同步区域
synchronized ReturnType methodname(){}
//使用这种方法是隐式调用,使用了this作为锁对象,如果是静态方法,则会导致该类中所有有同步关键字的函数都不能同时调用,也就是不能同时在多线程中执行多个不同的synchronized方法,要解决这种情况,请使用下面的方法
//使用语句块来进行标定,你可以在函数中使用这个语句块,这样同样的函数同一时间就只能执行一个了
synchronized (object){
}
Java线程的协作:线程和线程之间的配合通知
使用对方线程的wait()通知其进入等待态,使用notify()函数唤醒此线程
避免死锁
- 逻辑隔离。每个逻辑上独立的同步区域都使用各自的锁对象而不是共享同一个锁对象。
- 尽快释放。使用完毕后尽快释放锁对象。
- 按顺序申请。对于需要使用多个锁对象的区域,所有的申请都按照固定的顺序。