创建线程的方式有哪些?
1.继承Thread类,重写run方法。2.实现Runnable接口,实现run方法。3.实现Callable接口,实现call方法,结合FutureTask。(可以获取线程的返回值)4.线程池创建线程。
线程的状态?
new创建线程是新建状态;执行.start(),进入可执行状态,获取到cup执行权力,就运行;若没有获取锁资源,会进入阻塞状态;执行wait方法,等待状态(需要手动唤醒,释放锁资源);执行sleep方法,计时等待状态;run方法执行完成,死亡状态。
java中wait与sleep方法的不同?
相同点:wait与sleep都会让线程放弃cup的执行权力,进入阻塞状态。
不同点:wait方法是Object类中的,执行wait方法需要手动用notify或notifyAll唤醒;wait方法必须先获取对象锁才能执行;wait方法释放锁对象。sleep是Thread的静态方法;sleep不需要手动唤醒,到时间自动唤醒;sleep是静态方法,所以无需锁就可以执行;sleep不释放锁。
synchronized关键字底层原理?
synchronized采用互斥的方式让同一时刻最多只有一个线程获取锁。它底层由Monitor实现,Monitor中有三个属性,onwer,entrylist,waitset。当来一个线程的时候,先判断onwer是否有关联获取锁的线程,没有直接关联当前线程,若有,则进入entrylist(存放没有获取锁而阻塞的线程);如果执行了wait,sleep方法,进行waitset(进入等待状态的线程);
synchronized锁的形式?
Synchronized是一种互斥锁,同一时刻最多一个线程获取锁。
Synchronized锁有三种形式,分别为重量级锁、轻量级锁、偏向锁。
重量级锁:多线程环境中发生竞争,synchrinized锁就为重量级锁,底层是monitor实现的(jvm对象)
轻量级锁:多线程环境中,没有竞争锁,线程是错开时间加锁。一个线程获取锁,然后释放,下一个线程再获取锁释放。
偏向锁:很长一段时间内,一个线程多次获取同一个对象锁。
线程池的核心参数?
核心线程数
最大线程数(临时线程数=最大线程数-核心线程数)
临时线程最大存活时间
临时线程最大存活时间单位
阻塞队列 (ArrayBlokingQueue,LinkedBlokingQueue)
线程工厂
拒绝策略 (直接抛出异常(默认);直接删除队列中第一个任务;直接放弃当前任务;用主线程执行)
流程:当来一个任务时,会先判断核心线程是否没有空闲的。若有空闲的,交给核心线程执行;若没有,会判断阻塞队列是否满了。若阻塞队列没有满,进入阻塞队列;若满了,新建临时线程。若达到最大线程数,则会触发拒绝策略。