1. 如何配置线程池
-
通过new ThreadPoolExecutor类并指定相应的线程池参数创建并设置线程池,主要参数为核心线程数
corePoolSize
,最大线程数maximumPoolSize
,线程过期时间keepAliveTime
,工作队列workQueue
等。工作队列分为四种:有界队列,如ArrayBlockingQueue,LinkedBlockingQueue(指定容量);无界队列,如LinkedBlockingQueue(不指定容量或指定容量为Integer.MaxValue);立即提交队列,SynchronousQueue;优先提交队列,如PriorityBlockingQueue。 -
通过Executors工具类的相应方法创建工具类提供的不同类型的线程池。
2. 如何获取线程占用Cpu的状态
- 可以先通过
ps -ef -all
命令查询当前线程所属进程的pid,然后根据pid通过命令top -H -p PID
查询进程下线程的cpu和内存占用情况。
3. 线程有几种创建方式,分别是什么
- 通过继承Thread类,并且重写run方法的方式创建线程。
- 通过实现Runnable接口,并且实现run方法的方式创建线程。
- 通过实现Callable接口,并且实现run方法的方式创建线程。
- 通过线程池创建线程。
注:以上多种方式原理都是通过new Thread.start()
方式创建新线程。
4. 线程中如何共享数据
- 通过全局变量或者静态变量,但要注意线程安全问题,可以通过synchronized 关键字对边相关代码块加锁保证数据的一致性。也可以通过volatile关键字声明变量,这样可以保证对此变量的修改全局可见。
- 通过线程安全的容器,如ConcurrentHashMap,CopyOnWriteArrayList集合供线程安全的共享数据。
- 通过BlockingQueue,通过创建一个消息队列来实现多个线程共享队列中的数据。
5. 如何检测当前线程是否持有锁
- 使用Thread类的
Thread.holdsLock(Obj obj)
方法可以判断当前线程是否持有此对象的锁。 - 通过ReentrantLock类的
isHeldByCurrentThread()
方法,判断调用此方法的锁是否为当前线程持有。 - 可以通过ThreadMXBean类的
getThreadInfo(long id)
方法获取当前线程的信息ThreadInfo,然后通过ThreadInfo的getLockedMonitors()
方法获取所有的锁来判断是否持有锁