JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

java线程和线程池

wys521 2025-01-02 19:49:29 精选教程 22 ℃ 0 评论

1 线程和进程

进程是由一个或多个线程组成。


2 并发和并行

并发: 同一个CPU,多个线程交替运行,看起来是“同一时间”都在运行。

并行: 举例:两个线程在两个CPU上,同一时间都在运行。


3 创建线程的方式

继承Thread类

实现Runnable接口

实现Callable接口

线程池创建

  1. 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. 1) 加锁

sycronized关键字

Lock(必须手动释放锁,更灵活,也更复杂) -- ReadWriteLock, StampedLock(比读写锁多了一个乐观读)

  1. 2) ThreadLocal 让每个线程有自己的数据,互不干扰。

举例:RequestContextHolder 类中的 ThreadLocal 存储当前线程的 HttpServletRequest 和 HttpServletResponse

  1. 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. 1) FixedThreadPool

(LinkedBlockingQueue 无界队列,队列可能会一直增加)

ExecutorService a = Executors.newFixedThreadPool(int nThreads);

线程核心数量 nThreads,最大数量 nThreads,线程存活时间 0


  1. 2) CacheThreadPool

(SynchronousQueue 同步队列,有任务就给线程,队列容量0)

ExecutorService a = Executors.newCachedThreadPool();

线程核心数量 0,最大数量 Integer.MAX_VALUE,线程存活时间 60s


  1. 3) ScheduledThreadPool

(DelayedWorkQueue 延迟阻塞队列,时间升序排序,自动扩容,无界)

ExecutorService a = Executors.newScheduledThreadPool(int corePoolSize);

线程核心数量 corePoolSize,最大数量 Integer.MAX_VALUE,线程存活时间 0


  1. 4) SingleThreadExecutor

(LinkedBlockingQueue 无界队列)

ExecutorService a = Executors.newSingleThreadExecutor();

线程核心数量 1,最大数量 1,线程存活时间 0


  1. 5) SingleThreadScheduledExecutor

(DelayedWorkQueue 延迟阻塞队列,时间升序排序,自动扩容,无界)

ExecutorService a = Executors.newSingleThreadScheduledExecutor();

线程核心数量 1,最大数量 Integer.MAX_VALUE,线程存活时间 0

以上5类型线程池都是共用一个任务队列,运行的是线程,a.execute(Runnable ...)


  1. 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 线程池必须的参数

线程核心数量,最大数量,线程存活时间(等待新任务的空闲时间)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表