Java并发知识点(1)
1.1 线程与进程
并发执行的进程数目并不是由CPU数目限制
操作系统将cpu的时间片分配给每一个进程,给人并行处理的感觉
一个程序执行多个任务,与此同时每一个任务成为一个线程
可以同时运行一个线程以上的程序成为多线程程序
创建撤销一个线程比启动新线程的开销小很多
static void sleep(long millis) //休眠指定的毫秒数
如何在一个单独的线程中提供简单的过程
1. 第一步 将代码写到实现Runnable接口的类中
// runnable 接口
public interface Runnable{
void Run();
}
由于Runnable 是一个函数式接口,可以使用Lambda表达式
Runnable r = () ->{task code}; //这里其实是一个函数式接口
// 什么是函数式接口
函数式接口就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口
可以用lambada实现
2. 根据Runnable接口实现一个Thread对象
Thread t = new Thread(r)
3. 启动一个线程
t.start() // 创建一个执行run方法的新线程
线程的几个方法
Thread(Runnable target) //构造一个新线程 用于调用目标的指定方法
void start() //启动线程,引发调用run方法
void run() // 执行任务指令
1.2 中断线程
线程中断两个原因
1. 当线程Run方法执行方法体最后一条语句,并经由return语句返回
2. 出现了没有捕获的的异常
java中不存在强制终止线程的方法 interrupt可以请求终止线程
对线程调用interrupt方法,线程中断状态将被置位(线程总会不断的检验这个标志,判断线程是否被中断),想要知道线程是否被置位,就要调用静态的方法
while (!Thread.currentThread().isInterrupt()){
do some work;
}
如果线程无法检测中断状态,这是产生InterruptException异常的原因,普遍用法是线程将中断作为一个终止请求
每次工作迭代之后调用sleep方法,没有必要使用interrupt检测中断状态
中断状态被置位时调用sleep方法不会休眠
捕获interruptException异常
Runnable r =()->{
try{
while(more work to do){
do some work
Thread.sleep(delay)
}
}catch(interruptedException e){
// thread was interrupt during sleep
}finally{
// clean up
}
}
有两个类似方法interrupted和isInterrupt
interrupted是静态方法检测当前线程是否被中断
调用interrupted方法会清除线程的中断状态
isInterrupt是实例方法用来检验是否有线程中断,调用不会改变中断状态
常用中断方法
void interrupt()
向线程发送中断请求,线程中断状态被设置为true,如果线程被sleep方法调用阻塞,则InterruptException被抛出
static boolean interrupted()
// 测试当前进程是否被中断,这是一个静态方法该方法的副作用是将当前的中断状态变为fasle
static isInterrupted()
// 测试线程是否被终止,不会改变中断状态
static Thread currentThread()
// 返回当前执行线程的thread对象
实现Runnable接口比继承Thread所具有的优势
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立