1、进程:操作系统以进程为单位,分配系统资源,进程是资源分配的最小单位
2、线程:是操作系统调度执行的最小单位
3、线程同步:一个线程依赖于另一个线程,他没有得到另一个线程的消息时等待,直到被唤醒。
4、线程互斥:对与共享的系统资源,各个单个线程互斥,排它。
5、上下文切换:是指从一个进程或线程切换到另一个线程或者进程
在内核态进行上下文切换,
上下文切换是多任务操作系统
尽量避免上下文切换,比较耗费资源
6、内核态和用户态
内核态:不受任何限制可以访问硬件和内存,
用户态:执行代码不能直接访问硬件和内存,
7、线程的生命周期
操作系统层:初始状态、可运行状态、运行状态、休眠状态、终止状态
JVM层面:
NEW:线程start前
RUNNABLE(运行状态):,start
BLOCKED(阻塞):synchronized才会有这个状态,竞争没有获取到锁
WAITING:等待比如join()
TIMED_WAITING:超时等待
TERMINATED:结束终止
8、 Thread().start()和 Thread().run()的区别
start通过start0()调用JVM的线程的创建,然后JVM再去调用操作系统的创建,这个过程中会涉及到上下文的切换。而run就是一个普通的方法调用
9、协程:用户态创建的,在线程之中,是轻量级的,适用于IO任务,但不适用计算量大的。
10、java线程是抢占式的,可以通过设置抢占式的优先级,默认是5,但是没啥太大的效果
thread.setPriority(Thread.MAX_PRIORITY);
11、Thread.sleep() 不会释放锁,Object中的wait()会释放锁
12、怎么去停止线程
(1)、直接调用stop()如果线程执行一半就调用,下面的逻辑就不会走了,会出现线程安全问题,还会直接释放锁,不推荐使用。
(2)可以用中断,根据线程自身运行的状态,处理完成该线程的任务,才会停止该线程。
thread.interrupt( ); 设置线程中断标志位为true ,不会停止线程。
thread.isInterrupted(); 判断当前中段标志位是否为true ,不会清除标志中断位。
Thread.interrupted(); 判断点前线程的中断标志位是否为true,并清除中断标志位。
如果方法中判断是否中断,用到了Thread.sleep(1); 必须在调用一次 Thread.currentThread().interrupt();才能达到中断的效果