1.什么是JUC
java.util.concurrent 也就是java工具类,在并发编程中用到
业务:
普通的线程代码Thread,在企业中不会用到
Runnable: 没有返回值,效率相比于Callable相对较低!
所以企业中用的多的还是Callable中的锁
Lock:
2.线程和进程
进程:一个程序,QQ.exe Music.exe 程序的集合
一个进程往往可以包含多个线程,至少包含一个!
Java默认线程有几个线程?Main,GC.
线程:开了一个进程Typora,写字,写完后会自动保存(就是线程负责的)
Thread Runnable,Callable
java真的可以开启线程吗? 开不了的
从源码角度分析:
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
//本地方法,底层的C++ java无法操作硬件
private native void start0();
3.并发和并行
并发编程:并行,并发
并发(多线程操作同一个资源)
- CPU 一核,模拟出来多条线程,天下武功唯快不破,快速交替
并行(多个人一起走)
- CPU多核(多个线程同时执行):线程池
- 8核:cmd窗口输入systeminfo
可以通过代码查看
package com.qiu;
public class Demo01 {
public static void main(String[] args) {
//获取cpu的核数
//cpu 密集型,IO密集型
System.out.println(Runtime.getRuntime().availableProcessors());
}
}
并发编程的本质:充分利用Cpu的资源
4.线程有几个状态:
源码分析:
public enum State {
/**
* Thread state for a thread which has not yet started.
/
NEW,新生
RUNNABLE,运行
BLOCKED,阻塞
WAITING,等待死死地等
TIMED_WAITING,超时等待,有限定一个时间
TERMINATED;终止
}
5.wait/sleep的区别
1.来自不同的类
wait->Object
sleep->Thread
企业当中,休眠 -->TimeUnit.DAYS.sleep(1);
##### 2.关于锁的释放
wait会释放锁,sleep睡觉了,抱着锁睡觉,不会释放!
sleep方法调用之后,并没有释放锁。使得线程仍然可以同步控制。sleep不会让出系统资源;
而wait是进入线程等待池中等待,让出系统资源。
**我的理解:**wait释放锁,就是在等待的时候,把锁解开了,也就是让出了系统的资源.而sleep是在睡眠的时候不解开锁,不让出系统资源.进而别的程序也拿不到sleep所拥有的系统资源
3.使用的范围是不同的
wait:必须在同步代码块中,(等的时候有一个等的对象)
sleep:可以在任何地方睡
4.是否需要捕获异常
wait 不需要捕获异常
sleep需要捕获异常(可能会发生超时等待)