JUC并发编程之Thread学习笔记
JUC并发编程之Thread
HotSport虚拟机
1、Thread 类是Java中的线程,它底层是基于内核中的线程。所以Java中线程的调度也是基于操作系统。
2、Thread类中的核心方法
2.1 运行相关
run() : 线程实际运行的方法
start() : 启动线程,将线程状态变为runnable
2.2 线程阻塞方法
sleep() 静态native方法 当前线程睡眠,不会释放锁
// 获取到对象锁
wait() 释放锁,进入monitor管程等待队列,直到被其它获取到相同锁的线程调用notify()/notifyAll()方法
join()/join(n) 底层是wait() 方法作用是等待/等待n毫秒 线程结束。
2.3 线程打断
interrupt() 设置线程打断标志
interrupted() 判断线程是否被打断,同时清空打断标志
isInterrupted() 判断线程是否被打断,不清除打断标志
sleep join wait方法均会被打断标志中断。
2.4 线程调度与协调
wait notify : 和synchronized精确控制线程之间协同
yield() 设置当前线程让出时间片,进入 rannable状态。同城用于测试和调试
setPriority() 设置线程优先级。通常和虚拟机所处操作系统相关,因为他设置的是内核中线程的优先级。(得确认操作系统识别哪些优先级)
yield和setPriority 只是设置线程标识或者状态,具体调度依然是操作系统决定。wait notify则是编程人员决定的。
2.5 基于interrup方法的两阶段提交
```java
public class DoubleCommitThread {
private Thread monitor;
public void execute(){
monitor = new Thread(() -> {
while (true){
if (Thread.currentThread().isInterrupted()){
System.out.println("监控被终止,料理后事");
break;
}
System.out.println("做日志记录");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
System.out.println("重新设置打断");
// 重新设置打断标记
Thread.currentThread().interrupt();
}
}
});
monitor.start();
}
public static void main(String[] args) throws InterruptedException {
DoubleCommitThread doubleCommitThread = new DoubleCommitThread();
doubleCommitThread.execute();
Thread.sleep(10000L);
doubleCommitThread.monitor.interrupt();
}
}