“我有七十二般变化,万劫长生之术,会驾筋斗云,一纵就是十万八千里,如何坐不得这天位?”
目录
说说你对AQS的理解?
你知道AQS的原理是什么吗?
AQS对资源的共享模式有哪些?
AQS中有哪些需要重写的方法?
使用线程池有哪些好处?⭐
创建线程池的参数有哪些?⭐
线程池中线程数一般怎么设置?需要考虑哪些因素?
如何创建线程池?⭐
用于提交任务的execute()和submit()方法有什么区别?
话不多说,发车!
说说你对AQS的理解?
全称是AbstractQueuedSynchronizer,队列同步器,是用来构建锁或者同步器的基础框架
你知道AQS的原理是什么吗?
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。
如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列实现的,线程会首先尝试获取锁,如果失败就将当前线程及等待状态等信息包装成一个node节点加入到同步队列,接着会不断的循环尝试获取锁,如果失败就会阻塞自己直到自己被唤醒。而当持有锁的线程释放锁的时候,会唤醒队列中的后继线程。
AQS对资源的共享模式有哪些?
AQS中有哪些需要重写的方法?
package juc.aqs;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class MyAQS {
public static void main(String[] args) {
AbstractQueuedSynchronizer aqs = new AbstractQueuedSynchronizer() {
@Override
protected boolean tryAcquire(int arg) {
return super.tryAcquire(arg);
}
@Override
protected boolean tryRelease(int arg) {
return super.tryRelease(arg);
}
@Override
protected int tryAcquireShared(int arg) {
return super.tryAcquireShared(arg);
}
@Override
protected boolean tryReleaseShared(int arg) {
return super.tryReleaseShared(arg);
}
@Override
protected boolean isHeldExclusively() {
return super.isHeldExclusively();
}
};
}
}
使用线程池有哪些好处?⭐
创建线程池的参数有哪些?⭐
* @param corePoolSize the number of threads to keep in the pool, even
* if they are idle, unless {@code allowCoreThreadTimeOut} is set
* @param maximumPoolSize the maximum number of threads to allow in the
* pool
* @param keepAliveTime when the number of threads is greater than
* the core, this is the maximum time that excess idle threads
* will wait for new tasks before terminating.
* @param unit the time unit for the {@code keepAliveTime} argument
* @param workQueue the queue to use for holding tasks before they are
* executed. This queue will hold only the {@code Runnable}
* tasks submitted by the {@code execute} method.
线程池中线程数一般怎么设置?需要考虑哪些因素?
如何创建线程池?⭐
通过 ThreadPoolExecutor 的构造方法实现
通过 Executor 框架的工具类 Executors 来实现,可以创建三种类型的 ThreadPoolExecutor
package juc.aqs;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyAQS {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService1 = Executors.newFixedThreadPool(1);
ExecutorService executorService2 = Executors.newCachedThreadPool();
}
}
用于提交任务的execute()和submit()方法有什么区别?
整理面经不易,觉得有帮助的小伙伴点个赞吧~感谢收看!