Java线程是属于用户空间线程,在底层Java虚拟机映射内核线程,并在每个内核线程中委派用户线程的CPU时间
- 如何实现Java线程
两种方法:
- 直接使用Thread类
class Thread implements Runnable {
}
- 实现Runable接口
public class MyThread implements Runnable {
public MyThread(){
}
@Override
public void run() {
}
}
Thread相关方法:
yield()
转让CPU控制权,让处于Runnable的线程运行sleep()
线程进入休眠一段时间,不会释放锁join()
在一个线程调用thread.join(),该线程会等待thread线程执行完毕,才会继续执行该线程interrupte()
线程中断
- 线程状态的转换
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
NEW 初始状态,通过关键字new 创建线程对象,还没调用start()
RUNNABLE 可运行状态,线程调用了start(),但还没有获取CPU时间片,获取CPU,可变为 Running
BLOCKED 阻塞状态 线程阻塞于锁
WAITING 等待状态 线程处于等待其他线程发出通知或者中断操作
TIMED_WAITING 超时等待状态 在指定的时间后自己返回
TERMINATED 终止状态 线程已运行完毕
多线程
引入多线程的目的是“最大限度地利用CPU资源”,把串行处理变为并行处理,提高程序的执行效率。线程“贵”的原因
- 创建和销毁线程成本高,因为线程的创建和销毁是重量级的系统函数调用
- 线程本身占用内存大,像Java线程,一般分配1M左右
- 线程切换成本高,当需要进行线程切换,操作系统需要保留线程上下文,如果线程数多,可能会导致线程切换的时间超过线程的执行时间,会出现系统负载高