目录
多线程
两个线程,一个输出字母,一个输出数字,交替输出
方式一: LockSupport.unpark(Thread1) 与 LockSupport.park()
方式二:定义一个volatile的变r,自旋锁
方式三:两个阻塞队列capacity=1,先从队列里面取值,取到值就输出,取不到就阻塞等待
方式四:synchronize、wait、notify
注意遍历输出完之后要notify对方,否则对方会一直wait
方式五:lock.new两个condition,T1在condition1上等待,输出后通知condition2,T2在condition2上等待,输出后通知condition1
volatile
- 只要对volatile修饰的域产生写操作,所有的读操作都会看到这个修改,因为volatile域会被立即写入主存,而读操作就发生在主存中
- 如果多个任务同时访问某个域,那么这个域就应该是volatile的,否则就应该同步来访问
- 一个任务的任何写入操作对这个任务来说都是可视的,所以不需要volatile
线程与任务
- 我们对线程没有任何实际控制权
- 将任务附着在线程上,以使得线程驱动任务
正确使用线程池
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
// 核心线程数
poolTaskExecutor.setCorePoolSize(10);
// 线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程
poolTaskExecutor.setMaxPoolSize(100);
// 缓存队列
poolTaskExecutor.setQueueCapacity(50);
// 核心线程之外的线程在空闲时间到达之后会被销毁
poolTaskExecutor.setKeepAliveSeconds(200);
// 异步方法内部线程名称
poolTaskExecutor.setThreadNamePrefix("myThread-");
// n当然不是只有CallerRunsPolicy一种可选
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
poolTaskExecutor.initialize();
return poolTaskExecutor;
}
ThreadPoolExocutor 是一个executor
ThreadPoolTaskExecutor 是一个executor,还有定时调度功能
ExecutorService也是一个executor,
ScheduledExecutorService还是一个executor
newFixedThreadPool(