JUC:1_基础知识:进程和线程的区别、Java有几个线程、Java是否真的可以开启线程、并发和并行、Java线程状态、wait和sleep区别
Runable
Runable:没有返回值,效率比Callable低,功能也没有Callable强大,没有Callable常用。
进程和线程的区别
进程是操作系统中的应用程序,是资源分配的基本单位。线程是用来执行具体的任务和功能,是CPU调度和分派的基本单位。
通俗的讲:
- 进程是应用程序,是OS(操作系统)调度单位
- 线程是CPU最小调度单位
- 每个应用程序中有多个任务,线程就是任务,即每个进程中包含一个或多个线程
以office word为例,它可以写字、会上传云端、会自动保存,这些就是不同的线程去负责的,而你启动word,就是启动了一个进程。
Java中的线程需要弄明白的
Java有几个线程?
2个,mian线程和GC线程
对于Java而言,使用线程就是Thread、Runable、Callable
Java是否真的可以开启线程?
当然是开不了的
- Java启动线程是通过xxx.start()去启动
- 这个start()是synchronized修饰的同步方法,线程安全
- start()里面做了什么?
- 1.把当前线程加入线程组group
- 2.用startted来记录线程启动状态,初始化为flase
- 3.调用本地方法native start0()去启动线程并更把线程启动状态改为true
- Java是运行在JVM虚拟机上的,Java本身无法操作底层硬件,start0()底层是调用c++
具体可以去查看线程启动的源码,从start进去。
可以看到start()是synchronized方法,是线程安全的方法。
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system":主方法线程或“系统”不会调用此方法
* group threads created/set up by the VM. Any new functionality added:由虚拟机创建/设置的组线程。添加了任何新功能
* to this method in the future may have to also be added to the VM.:将来可能还需要将此方法添加到虚拟机中
*
* A zero status value corresponds to state "NEW".:零状态值对应于状态"NEW"
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started:通知小组该线程即将启动
* so that it can be added to the group's list of threads:以便将其添加到该组的线程列表中
* and the group's unstarted count can be decremented.:并且该组的未启动计数可以递减 */
group.add(this);//private ThreadGroup group;把线程加入到线程组里
boolean started = false;//线程是否启动的标志:false-->true
try {
start0();//private native void start0(),native 修饰的,因此可以知道start0()是一个本地方法,底层是调用c++
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
并发和并行
**并发:**一个核心处理多个任务,一时刻,多线程交替执行,CPU单核只有并发、没有并行
**并行:**多个核心处理多个任务,一时刻,多线程同时执行,CPU线程核心数=最大并行执行数,所以你的线程池配置多少和CPU核心数有很大关系
**并发编程的本质:**充分利用CPU资源
Java线程状态:Thread.State
线程状态,线程可以处于以下状态之一:
- NEW:尚未启动的线程处于此状态
- RUNNABLE:再Java虚拟机中执行的线程处于此状态
- BLOCKER:被阻塞等待监视器锁定的线程处于此状态
- WAITING:正在等待另一个线程执行特定动作的线程处于此状态
- TIMED_WAITING:正在等待另一个线程执行特定动作到达指定时间的线程处于此状态
- TERMINATED:已退出的线程处于此状态
一个线程可以再给定时间点处于一个状态,这些状态是不反应任何操作系统线程状态的虚拟机状态。
线程中断或者结束,一旦进入TERMINATED
终止状态,就不能再次启动
wait和sleep区别
来自不同的类
wait–>Object
sleep–>Thread
关于锁的释放
wait会释放锁
sleep不会释放锁,抱着锁睡觉
适用范围不同
wait必须在同步代码块或同步方法里
sleep可以在任何地方使用
是否需要捕获异常
wait不需要捕获异常
sleep需要捕获异常,因为肯能发生超时等待的问题