线程相关

1.创建线程的方式?
通过runnable和Thread

2.Thread类中的start()和run()方法有什么区别?
大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。

3.Java中Runnable和Callable有什么不同?
Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。

4.四种线程池
newCacheThreadPool
可缓存线程池,如果超长可以灵活回收线程,如果不可以回收就新建线程
newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadTool
创建一个定长线程池,支持定时及周期性任务执行
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

5.线程池拒绝策略
AbortPolicy(堕胎政策):后面的线程直接丢弃并且抛出异常
DiscardPolicy(丢弃政策):后面的线程直接丢弃但是不抛出异常
DiscardOldestPolicy(丢弃最早的线程):队列中最早的元素移除,再尝试添加,如果失败则按该策略不断尝试
CallerRunsPolicy:如果添加失败,那么主线程会调用自己执行器中的execute方法来执行该任务

6.notify,notifyAll区别?
notify:唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;
notifyAll:唤醒所有正在等待这个对象的monitor的线程;
只能在同步代码块中调用

6.wait,sleep区别?
当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
调用sleep()方法的过程中,线程不会释放对象锁

7.submit()和execute()的区别
execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口

8.线程池底层原理
用户通过submit提交一个任务。线程池会执行如下流程:
1.判断当前运行的worker(线程)数量是否超过corePoolSize,如果不超过corePoolSize。就创建一个worker直接执行该任务。——线程池最开始是没有worker在运行的
2.如果正在运行的worker数量超过或者等于corePoolSize,那么就将该任务加入到workQueue队列中去。
3.如果workQueue队列满了,也就是offer方法返回false的话,就检查当前运行的worker数量是否小于maximumPoolSize,如果小于就创建一个worker直接执行该任务。
4.如果当前运行的worker数量是否大于等于maximumPoolSize,那么就执行RejectExecutionHandler来拒绝这个任务的提交。

你可能感兴趣的:(线程相关)