“一句话”面试题——Java 线程

1、创建线程的方式及实现
有三种方式:
1、继承Thread,重写run方法,通过线程对象的start方法调用。
2、实现Runnable接口,实现run方法,通过线程对象的start方法调用。
3、通过Callable和future:
实现Callable接口,实现call方法,创建Callable对象实例。
Task task = new Task();
创建FutureTask对象,并包装Callable对象实例。
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
使用futureTask作为Thread对象的target,创建并启动线程。
Thread thread = new Thread(futureTask);       thread.start();

2、sleep、wait、join、yield方法的区别
1、sleep方法需要指定等待时间、sleep不会释放锁。
2、wait方法需要和notify或者notifyAll一起使用,wait方法必须放在synchronized语句中。
wait的对象是Object,wait可以指定等待的时间,等待过程中会释放锁。
3、join方法会使当前线程等待,直到join方法结束才能继续运行。
4、yield方法和sleep方法类似,不会释放锁,yield方法没有参数,yield方法只会使同优先级
或者更高优先级的线程得到执行机会。

3、ThreadLocal的原理分析
ThreadLocal内部有一个map集合,每个线程都对应一个线程的本地变量,将变量和线程相绑定。

4、讲讲线程池的实现原理
当一个任务进入线程池,如果当前线程队列没满,则创建一个线程执行当前任务,如果线程队列满了,
则先判断任务队列,如果没满,则加入任务队列,如果满了,则交给饱和策略来处理这个任务。

5、线程池的几种方式与使用场景
在Executors类中提供了一些静态工厂,生成一些常见的线程池:
1、newFixedThreadPool:创建固定大小线程池。
2、newCacheThreadPool:创建可缓存的线程池。
3、newSingleThreadExecutor:创建一个单线程的线程池。
4、newScheduledThreadPool:创建一个无限大小线程池,支持周期性定时任务。
5、newSingleThreadScheduledExecutor:创建一个单线程的线程池,支持定时任务。

6、线程的生命周期
新建(new)、就绪(Runnable)、运行(Running)、阻塞(blocked)、死亡(dead)

猜你喜欢

转载自blog.csdn.net/cool_summer_moon/article/details/80967027