java线程池创建的四种多线程在实际项⽬中的简单应⽤
项⽬中如何使⽤多线程
多线程在项⽬中主要⽤来解决并发任务执⾏。java中线程的主要实现⽅式有三种:继承Thread类 实现Runnable接⼝ 实现Callable接⼝。另外还可以通过Executor类来创建多线程线程池。
线程⽣命周期:⾸先通过继承thread或者实现runnable接⼝来创建⼀个线程,当调⽤线程的start⽅法,线程进⼊就绪状态,如果这时处理器有资源运⾏此线程,线程就进⼊运⾏状态,如果线程内部调⽤了sleep就会放弃cpu资源,返回到阻塞状态,线程等待某个通知,sleep 时间到了之后,如果其他线程发送通知,那么当前线程就从阻塞状态变为就绪状态恢复执⾏。另如果调⽤了yield()⽅法也会从运⾏状态变为就绪状态。⼀般来说线程执⾏完毕或者调⽤stop⽅法线程结束⽣命周期。
四种模板线程池:1可缓存线程池 newCachedThreadPool 2定长线程池 newFixedThreadPool 3定长⽀持定时及周期性任线程池,newScheduledThreadPool 4单线程化的线程池(有序) newSingleThreadExecutor 。我们在项⽬中主要使⽤了第⼆种就是定长线程池newFixedThreadPool,⼀般多线程进⾏并⾏任务处理需要配合队列使⽤。队列中存放任务信息,当线程池中的线程进⾏任务处理,主动去队列领取任务,队列将任务弹出并交由线程执⾏,所有线程谁先执⾏完,就领取⾏的任务,直到队列中没有任务。
线程安全:⼀般通过加锁解决安全问题,保证数据⼀致性。⼀般我们可以使⽤synchronized标记⽅法或者代码块,来保证原⼦性操作。但是synchronized性能不如volatile。 在java底层中⼀些设计线程安全的源码都是⽤了volatile关键字。多线程如果要保证数据安全必须要保证原⼦性、可见性以及有序性。⼀般情况下当多个线程同时执⾏时,如果多个线程同时访问同⼀变量,如果变量所在⽅法没有使⽤synchronized,将导致每个线程只关注⾃⼰线程内cache的变量值,当多个线程将变量同步到主线程的主存时,会发⽣数据不⼀致的情况。如果使⽤volatile可以让变量拥有可见性,多个线程进⾏执⾏时,每个线程都会看到主线程中的主存的变量值发⽣的改变,进⾏修正,保证与⾃⼰线程数据同步,在线程修改变量时,volatile关键字会强制将修改的值⽴即写⼊主存,其他线程中的对应缓存变量就会被强制标记为⽆效,⽽从主存中进⾏同步。
项⽬业务场景:
批量页⾯静态化 在系统中,商品详情页我们使⽤freemarker来进⾏页⾯静态化,每天夜⾥12点开始要对所有商品页⾯进⾏⼀遍静态化,由于商品数量⽐较多 如果使⽤单线程将耗时过长,我们使⽤⼀个定长线程池进⾏批量执⾏,将任务放在队列中,多个线程同时领取并执⾏。
订单处理(⽤户下单后可能⽀付状态不明确,我们后台可以通过多线程去主动核实第三⽅⽀付状态,来更新我们系统的订单状态)
登录后⽤户信息处理(⽤户登录后应该通知各相关系统将⽤户常⽤数据进⾏缓存 以快速响应登录⽤户),
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论