网站首页 > 精选教程 正文
1 线程和进程
进程是由一个或多个线程组成。
2 并发和并行
并发: 同一个CPU,多个线程交替运行,看起来是“同一时间”都在运行。
并行: 举例:两个线程在两个CPU上,同一时间都在运行。
3 创建线程的方式
继承Thread类
实现Runnable接口
实现Callable接口
线程池创建
- 1) Runnable接口和Callable接口的区别?
Runnable接口没有返回参数,Callable接口有。
4 线程如何使用多核CPU
JVM控制,参数 -XX:ActiveProcessorCount=n ,效果:指定n核CPU处理多线程
5 线程的交互对象
硬盘
数据库
--JDBC connection
--memchache/redis(缓存)
内存
网卡
6 线程的状态(5种)
新建,就绪,运行,等待(阻塞),销毁(死亡)
7 sleep() 和 wait()
类的不同:sleep() 来自 Thread,wait() 来自 Object。
释放锁:sleep() 不释放锁;wait() 释放锁。
用法不同:
sleep() 时间到会自动恢复;
wait() 需要使用 notify()/notifyAll()唤醒
8 多线程的数据安全
- 1) 加锁
sycronized关键字
Lock(必须手动释放锁,更灵活,也更复杂) -- ReadWriteLock, StampedLock(比读写锁多了一个乐观读)
- 2) ThreadLocal 让每个线程有自己的数据,互不干扰。
举例:RequestContextHolder 类中的 ThreadLocal 存储当前线程的 HttpServletRequest 和 HttpServletResponse
- 3) 线程安全的数据类型:
原子类(java.util.concurrent.atomic):AtomicBoolean, AtomicInteger, AtomicLong等
集合类:
java8之前:
Vector, Stack(不推荐使用,可以用 LinkedList 替代), HashTable, ConcurrentHashMap(java8优化,提高并发性能 ), ConcurrentLinkedQueue, ConcurrentLinkedDeque 等
java8及之后:
安全集合类: CopyOnWriteArrayList(适用于读多,写少的场景), CopoOnwriteArraySet(同前面) 等
集合包装方法(对象的方法添加synchronized修饰符,效率没有直接用安全类高。):Collections.sycronizedList(...),Collections.sycronizedMap(...)等
9 线程池的种类(6种,包:java.util.concurrent)
- 1) FixedThreadPool
(LinkedBlockingQueue 无界队列,队列可能会一直增加)
ExecutorService a = Executors.newFixedThreadPool(int nThreads);
线程核心数量 nThreads,最大数量 nThreads,线程存活时间 0
- 2) CacheThreadPool
(SynchronousQueue 同步队列,有任务就给线程,队列容量0)
ExecutorService a = Executors.newCachedThreadPool();
线程核心数量 0,最大数量 Integer.MAX_VALUE,线程存活时间 60s
- 3) ScheduledThreadPool
(DelayedWorkQueue 延迟阻塞队列,时间升序排序,自动扩容,无界)
ExecutorService a = Executors.newScheduledThreadPool(int corePoolSize);
线程核心数量 corePoolSize,最大数量 Integer.MAX_VALUE,线程存活时间 0
- 4) SingleThreadExecutor
(LinkedBlockingQueue 无界队列)
ExecutorService a = Executors.newSingleThreadExecutor();
线程核心数量 1,最大数量 1,线程存活时间 0
- 5) SingleThreadScheduledExecutor
(DelayedWorkQueue 延迟阻塞队列,时间升序排序,自动扩容,无界)
ExecutorService a = Executors.newSingleThreadScheduledExecutor();
线程核心数量 1,最大数量 Integer.MAX_VALUE,线程存活时间 0
(以上5类型线程池都是共用一个任务队列,运行的是线程,a.execute(Runnable ...))
- 6) ForkJoinPool(分支处理,结果汇总)
ForkJoinPool a = new ForkJoinPool();
ForkJoinTask task = new (? extends ForkJoinTask)(...);
返回类型 res = a.invoke(task);
【注】? 代表实现ForkJoinTask这个抽象类的类,在方法compute()中实现【递归或分治逻辑(生成新的task1...,并调用task1.fork()方法,最后合并task1.join(),task2.join(),...)】,并返回“返回类型”。
运行的是ForkJoinTask,运行线程的最大数量限制为32767个,尝试创建大于最大数量的池会导致IllegalArgumentException
只有当池关闭或内部资源耗尽时,此实现才会拒绝提交的任务(即通过抛出RejectedExecutionException)
1) 非常适合产生子任务的任务
2) 每个线程有自己的队列
10 线程池必须的参数
线程核心数量,最大数量,线程存活时间(等待新任务的空闲时间)
- 上一篇: java线程池闭坑指南
- 下一篇: JAVA多线程实现的四种方式
猜你喜欢
- 2025-01-02 Java 多线程面试秘籍:25 道题全攻略
- 2025-01-02 Java 线程和操作系统的线程有啥区别?
- 2025-01-02 Java线程唤醒与阻塞的常用方法
- 2025-01-02 JAVA多线程实现的四种方式
- 2025-01-02 两万字带你了解Java多线程(详细大总结)
- 2025-01-02 java线程池闭坑指南
- 2025-01-02 Java多线程引发的性能问题以及调优策略
- 2025-01-02 深入解读-全流程分析Netty设计思路与实践
- 2025-01-02 Java多线程实战|CountDownLatch原理介绍及使用场景
- 2025-01-02 一文搞懂JAVA中的线程池
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)