专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

ThreadPoolExecutor源码解析

  问题
  抱着问题,看源码,不至于让自己在看源码时懵逼,看的同时参考网上的源码分析,加深自己的理解线程池的核心线程数,最大线程数,队列间的关系?设置核心线程数,能大于最大线程数么?释放线程时,怎样才能释放核心线程?线程池为什么能维持线程不释放,随时运行各种任务?简介
  线程池常用的创建方法有那么几种:
  newFixedThreadPool()
  newSingleThreadExecutor()
  newCachedThreadPool()
  newScheduledThreadPool()
  线程池的创建方式,是装饰模式的一种体现,底层封装ThreadPoolExecutor这个类
  在阿里巴巴开放的代码规范里,因为线程池默认使用无界队列,会导致线程无限增长导致应用oom,所以要显示的创建ThreadPoolExecutorpublicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueRunnableworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler);}参数说明corePoolSize代表核心线程池的个数,当线程池当前的个数大于核心线程池的时候,线程池会回收多出来的线程maximumPoolSize代表最大的线程池个数,当线程池需要执行的任务大于核心线程池的时候,会创建更多的线程,但是最大不能超过这个数keepAliveTime代表空余的线程存活的时间,当多余的线程完成任务的时候,需要多长时间进行回收,时间单位是unit去控制workQueue非常重要,这个工作队列会存放所有待执行的Runnable对象ArrayBlockingQueue:有界队列。是一种基于数组的有界阻塞队列LinkedBlockingQueue:无界队列。是一个基于链表的阻塞队列,吞吐量通常要高于ArrayBlockingQueue,newSingleThreadExecutor,newFixedThreadPool默认队列SynchronousQueue:直接提交。是一种不存储元素的阻塞队列,每个插入操作必须等另一个线程调用移除操作,否则插入操作一直处于阻塞状态。newCachedThreadPool使用了这个队列PriorityBlockingQueue:是一种具有优先权的阻塞队列,优先级大的任务可以先执行,用户由此可以控制任务的执行顺序DelayedWorkQueue:优先级队列,newScheduledThreadPool默认这个队列threadFactory创建线程时,使用的工厂DefaultThreadFactory默认,创建一个同线程组且默认优先级的线程PrivilegedThreadFactory,使用访问权限创建一个权限控制的线程handler线程池满时,提供的拒绝策略AbortPolicy:默认,抛出异常Taskr。toString()rejectedfrome。toString()DiscardPolicy:不抛异常,直接丢弃当前线程DiscardOldestPolicy::如果线程池没有中止,移除队列第一个任务,再执行当前任务CallerRunsPolicy:如果线程池没有中止,直接用调用者的线程资源执行任务执行过程
  判断是否大于核心线程数,小于,创建线程超过核心线程数,判断队列是否满,不满,创建线程队列已满,判断是否超过最大线程数,没有超过,创建线程超过最大线程数,执行拒绝策略类说明An{linkExecutorService}thatexecuteseachsubmittedtaskusingoneofpossiblyseveralpooledthreads,normallyconfiguredusing{linkExecutors}factorymethods。线程池主要解决两个问题:在执行大量异步线程时改善性能,应付减少每个任务的调用开销,并且提供了一种限制和管理资源(包含线程)的方法。ThreadPoolExecutor提供了一些基本的统计,比如完成任务的数量。pThreadpoolsaddresstwodifferentproblems:theyusuallyprovideimprovedperformancewhenexecutinglargenumbersofasynchronoustasks,duetoreducedpertaskinvocationoverhead,andtheyprovideameansofboundingandmanagingtheresources,includingthreads,consumedwhenexecutingacollectionoftasks。Each{codeThreadPoolExecutor}alsomaintainssomebasicstatistics,suchasthenumberofcompletedtasks。在大部分的上下文场景里,这个类提供了很多可调整的参数和可扩展的hook。不管怎样,开发者可以更方便的创建无界线可回收的线程池,固定的线程池,单个后台线程,这些都是为大部分应用场景设置的默认线程池配置。如果以上线程方法不足以满足应用场景,可以手动配置和调校线程池ThreadPoolExecutorpTobeusefulacrossawiderangeofcontexts,thisclassprovidesmanyadjustableparametersandextensibilityhooks。However,programmersareurgedtousethemoreconvenient{linkExecutors}factorymethods{linkExecutorsnewCachedThreadPool}(unboundedthreadpool,withautomaticthreadreclamation),{linkExecutorsnewFixedThreadPool}(fixedsizethreadpool)and{linkExecutorsnewSingleThreadExecutor}(singlebackgroundthread),thatpreconfiguresettingsforthemostcommonusagescenarios。Otherwise,usethefollowingguidewhenmanuallyconfiguringandtuningthisclass:dl核心和最大线程池数量dtCoreandmaximumpoolsizesdt线程池执行器将会根据核心线程池数量和最大线程池数量自动地调整线程池大小。ddA{codeThreadPoolExecutor}willautomaticallyadjustthepoolsize(see{linkgetPoolSize})accordingtotheboundssetbycorePoolSize(see{linkgetCorePoolSize})andmaximumPoolSize(see{linkgetMaximumPoolSize})。当一个新的线程提交到方法里,如果当前执行的线程小于核心线程数,会根据请求新建一个线程,即便其他线程仍旧闲置。如果多于核心线程数但小于最大线程数线程在执行。一个新线程将被创建,直到队列满。如果需要设置maximumPoolSize为无界的,比如Integer。MAXVALUE,那么将允许线程池容纳任意数量的任务并发执行。在典型的场景中,corePoolSize和maximumPoolSize仅仅在构造中设置,但是我们也可以动态的调整用setCorePoolSize和setMaximumPoolSize函数Whenanewtaskissubmittedinmethod{linkexecute(Runnable)},andfewerthancorePoolSizethreadsarerunning,anewthreadiscreatedtohandletherequest,evenifotherworkerthreadsareidle。IftherearemorethancorePoolSizebutlessthanmaximumPoolSizethreadsrunning,anewthreadwillbecreatedonlyifthequeueisfull。BysettingcorePoolSizeandmaximumPoolSizethesame,youcreateafixedsizethreadpool。BysettingmaximumPoolSizetoanessentiallyunboundedvaluesuchas{codeInteger。MAXVALUE},youallowthepooltoaccommodateanarbitrarynumberofconcurrenttasks。Mosttypically,coreandmaximumpoolsizesaresetonlyuponconstruction,buttheymayalsobechangeddynamicallyusing{linksetCorePoolSize}and{linksetMaximumPoolSize}。dddtOndemandconstructiondtddBydefault,evencorethreadsareinitiallycreatedandstartedonlywhennewtasksarrive,butthiscanbeoverriddendynamicallyusingmethod{linkprestartCoreThread}or{linkprestartAllCoreThreads}。Youprobablywanttoprestartthreadsifyouconstructthepoolwithanonemptyqueue。dddtCreatingnewthreadsdtddNewthreadsarecreatedusinga{linkThreadFactory}。Ifnototherwisespecified,a{linkExecutorsdefaultThreadFactory}isused,thatcreatesthreadstoallbeinthesame{linkThreadGroup}andwiththesame{codeNORMPRIORITY}priorityandnondaemonstatus。BysupplyingadifferentThreadFactory,youcanalterthethreadsname,threadgroup,priority,daemonstatus,etc。Ifa{codeThreadFactory}failstocreateathreadwhenaskedbyreturningnullfrom{codenewThread},theexecutorwillcontinue,butmightnotbeabletoexecuteanytasks。ThreadsshouldpossessthemodifyThread{codeRuntimePermission}。Ifworkerthreadsorotherthreadsusingthepooldonotpossessthispermission,servicemaybedegraded:configurationchangesmaynottakeeffectinatimelymanner,andashutdownpoolmayremaininastateinwhichterminationispossiblebutnotcompleted。dddtKeepalivetimesdt如果当前线程数大于核心线程数,那些超过keepAliveTime时间的限制线程将会被终止。当线程池没有充分利用的情况下,此策略可以减少资源的消耗如果线程池变得活跃,新的线程将会被构造。我们可以用setKeepAliveTime参数动态改变,用一个Long。MAXVALU,TimeUnitNANOSECONDS作为保活时间,那么空闲的线程可以避免在线程池关闭之前被终止。保活策略只有在当前线程池线程数量大于核心线程池数量时,才起作用。allowCoreThreadTimeOut用于控制当任务线程空闲时,是否允许线程等待keepAliveTime时间,以便在这个过程中,有新的任务进来ddIfthepoolcurrentlyhasmorethancorePoolSizethreads,excessthreadswillbeterminatediftheyhavebeenidleformorethanthekeepAliveTime(see{linkgetKeepAliveTime(TimeUnit)})。Thisprovidesameansofreducingresourceconsumptionwhenthepoolisnotbeingactivelyused。Ifthepoolbecomesmoreactivelater,newthreadswillbeconstructed。Thisparametercanalsobechangeddynamicallyusingmethod{linksetKeepAliveTime(long,TimeUnit)}。Usingavalueof{codeLong。MAXVALUE}{linkTimeUnitNANOSECONDS}effectivelydisablesidlethreadsfromeverterminatingpriortoshutdown。Bydefault,thekeepalivepolicyappliesonlywhentherearemorethancorePoolSizethreads。Butmethod{linkallowCoreThreadTimeOut(boolean)}canbeusedtoapplythistimeoutpolicytocorethreadsaswell,solongasthekeepAliveTimevalueisnonzero。dddtQueuingdtBlockingQueu用于存放提交的任务,队列的实际容量与线程池大小相关联ddAny{linkBlockingQueue}maybeusedtotransferandholdsubmittedtasks。Theuseofthisqueueinteractswithpoolsizing:ul如果当前线程池小于核心线程数,执行器总是优先创建一个新线程,而不是从队列获取liIffewerthancorePoolSizethreadsarerunning,theExecutoralwaysprefersaddinganewthreadratherthanqueuing。li如果当前线程池大于核心线程数,执行器是从队列获取空闲线程,而不是从新建一个空闲线程liIfcorePoolSizeormorethreadsarerunning,theExecutoralwaysprefersqueuingarequestratherthanaddinganewthread。li如果当前线程池任务数量大于核心线程池数量,且队列中无空闲任务线程,将会创建一个任务线程,直到超出最大线程数后,则任务将会被拒绝liIfarequestcannotbequeued,anewthreadiscreatedunlessthiswouldexceedmaximumPoolSize,inwhichcase,thetaskwillberejected。liulThreadPoolExecutor有3中出队列策略Therearethreegeneralstrategiesforqueuing:olliemDirecthandoffs。emAgooddefaultchoiceforaworkqueueisa{linkSynchronousQueue}thathandsofftaskstothreadswithoutotherwiseholdingthem。Here,anattempttoqueueataskwillfailifnothreadsareimmediatelyavailabletorunit,soanewthreadwillbeconstructed。Thispolicyavoidslockupswhenhandlingsetsofrequeststhatmighthaveinternaldependencies。DirecthandoffsgenerallyrequireunboundedmaximumPoolSizestoavoidrejectionofnewsubmittedtasks。Thisinturnadmitsthepossibilityofunboundedthreadgrowthwhencommandscontinuetoarriveonaveragefasterthantheycanbeprocessed。liliemUnboundedqueues。emUsinganunboundedqueue(forexamplea{linkLinkedBlockingQueue}withoutapredefinedcapacity)willcausenewtaskstowaitinthequeuewhenallcorePoolSizethreadsarebusy。Thus,nomorethancorePoolSizethreadswilleverbecreated。(AndthevalueofthemaximumPoolSizethereforedoesnthaveanyeffect。)Thismaybeappropriatewheneachtaskiscompletelyindependentofothers,sotaskscannotaffecteachothersexecution;forexample,inawebpageserver。Whilethisstyleofqueuingcanbeusefulinsmoothingouttransientburstsofrequests,itadmitsthepossibilityofunboundedworkqueuegrowthwhencommandscontinuetoarriveonaveragefasterthantheycanbeprocessed。liliemBoundedqueues。emAboundedqueue(forexample,an{linkArrayBlockingQueue})helpspreventresourceexhaustionwhenusedwithfinitemaximumPoolSizes,butcanbemoredifficulttotuneandcontrol。Queuesizesandmaximumpoolsizesmaybetradedoffforeachother:UsinglargequeuesandsmallpoolsminimizesCPUusage,OSresources,andcontextswitchingoverhead,butcanleadtoartificiallylowthroughput。Iftasksfrequentlyblock(forexampleiftheyareIObound),asystemmaybeabletoscheduletimeformorethreadsthanyouotherwiseallow。Useofsmallqueuesgenerallyrequireslargerpoolsizes,whichkeepsCPUsbusierbutmayencounterunacceptableschedulingoverhead,whichalsodecreasesthroughput。lioldd拒绝策略dtRejectedtasksdt当执行器关闭时,或者执行器用有界的最大线程池数量和任务队列容量饱和时,新提交的任务将会被拒绝。在其他情况下,execute方法将调用RejectedExecutionHandler的rejectedExecution方法处理任务。有四种处理策略提供如下:ddNewtaskssubmittedinmethod{linkexecute(Runnable)}willbeemrejectedemwhentheExecutorhasbeenshutdown,andalsowhentheExecutorusesfiniteboundsforbothmaximumthreadsandworkqueuecapacity,andissaturated。Ineithercase,the{codeexecute}methodinvokesthe{linkRejectedExecutionHandlerrejectedExecution(Runnable,ThreadPoolExecutor)}methodofits{linkRejectedExecutionHandler}。Fourpredefinedhandlerpoliciesareprovided:olliInthedefault{linkThreadPoolExecutor。AbortPolicy},thehandlerthrowsaruntime{linkRejectedExecutionException}uponrejection。liliIn{linkThreadPoolExecutor。CallerRunsPolicy},thethreadthatinvokes{codeexecute}itselfrunsthetask。Thisprovidesasimplefeedbackcontrolmechanismthatwillslowdowntheratethatnewtasksaresubmitted。liliIn{linkThreadPoolExecutor。DiscardPolicy},ataskthatcannotbeexecutedissimplydropped。liliIn{linkThreadPoolExecutor。DiscardOldestPolicy},iftheexecutorisnotshutdown,thetaskattheheadoftheworkqueueisdropped,andthenexecutionisretried(whichcanfailagain,causingthistoberepeated。)liolItispossibletodefineanduseotherkindsof{linkRejectedExecutionHandler}classes。Doingsorequiressomecareespeciallywhenpoliciesaredesignedtoworkonlyunderparticularcapacityorqueuingpolicies。dddtHookmethodsdtddThisclassprovides{codeprotected}overridable{linkbeforeExecute(Thread,Runnable)}and{linkafterExecute(Runnable,Throwable)}methodsthatarecalledbeforeandafterexecutionofeachtask。Thesecanbeusedtomanipulatetheexecutionenvironment;forexample,reinitializingThreadLocals,gatheringstatistics,oraddinglogentries。Additionally,method{linkterminated}canbeoverriddentoperformanyspecialprocessingthatneedstobedoneoncetheExecutorhasfullyterminated。pIfhookorcallbackmethodsthrowexceptions,internalworkerthreadsmayinturnfailandabruptlyterminate。dddtQueuemaintenancedtddMethod{linkgetQueue()}allowsaccesstotheworkqueueforpurposesofmonitoringanddebugging。Useofthismethodforanyotherpurposeisstronglydiscouraged。Twosuppliedmethods,{linkremove(Runnable)}and{linkpurge}areavailabletoassistinstoragereclamationwhenlargenumbersofqueuedtasksbecomecancelled。dddtFinalizationdtddApoolthatisnolongerreferencedinaprogramemANDemhasnoremainingthreadswillbe{codeshutdown}automatically。Ifyouwouldliketoensurethatunreferencedpoolsarereclaimedevenifusersforgettocall{linkshutdown},thenyoumustarrangethatunusedthreadseventuallydie,bysettingappropriatekeepalivetimes,usingalowerboundofzerocorethreadsandorsetting{linkallowCoreThreadTimeOut(boolean)}。dddlpbExtensionexampleb。Mostextensionsofthisclassoverrideoneormoreoftheprotectedhookmethods。Forexample,hereisasubclassthataddsasimplepauseresumefeature:pre{codeclassPausableThreadPoolExecutorextendsThreadPoolExecutor{privatebooleanisPaused;privateReentrantLockpauseLocknewReentrantLock();privateConditionunpausedpauseLock。newCondition();publicPausableThreadPoolExecutor(。。。){super(。。。);}protectedvoidbeforeExecute(Threadt,Runnabler){super。beforeExecute(t,r);pauseLock。lock();try{while(isPaused)unpaused。await();}catch(InterruptedExceptionie){t。interrupt();}finally{pauseLock。unlock();}}publicvoidpause(){pauseLock。lock();try{isPausedtrue;}finally{pauseLock。unlock();}}publicvoidresume(){pauseLock。lock();try{isPausedfalse;unpaused。signalAll();}finally{pauseLock。unlock();}}}}presince1。5authorDougLea代码解析代码分析1。如果少于核心线程数,则试着用给定的第一个task启动线程。对addworker以原子方式检查运行状态和任务统计,通过返回false,来防止在增加线程时出现错误警报2。如果一个task能成功排队,这是我们仍旧需要两次检查,无论我们是否应该加入线程(因为最后检查时存在的已经死掉)或者在刚进入时线程池就关掉。因此我们重新检查状态,以确保停止时回滚回队列;如果没有,则启动新线程,3。如果不能从队列拿去,我们尝试新建线程。如果失败,我们就知道已经停止或者饱和并且丢弃这个任务intcctl。get();如果少于核心线程数,则创建if(workerCountOf(c)corePoolSize){if(addWorker(command,true))return;cctl。get();}如果正在运行,并且可以进入队列if(isRunning(c)workQueue。offer(command)){intrecheckctl。get();if(!isRunning(recheck)remove(command))reject(command);elseif(workerCountOf(recheck)0)addWorker(null,false);}elseif(!addWorker(command,false))reject(command);}
  核心工作方法addWorkerprivatebooleanaddWorker(RunnablefirstTask,booleancore){try{wnewWorker(firstTask);finalThreadtw。thread;}finally{if(!workerStarted)addWorkerFailed(w);}}
  查看Worker这个类包装类,调用thread。start()方法时候,实际调用的就是Worker类的run()方法privatefinalclassWorkerextendsAbstractQueuedSynchronizerimplementsRunnableWorker(RunnablefirstTask){setState(1);inhibitinterruptsuntilrunWorkerthis。firstTaskfirstTask;this。threadgetThreadFactory()。newThread(this);}{publicvoidrun(){runWorker(this);}}
  具体干活的方法runWorker死循环,等条件,执行线程finalvoidrunWorker(Workerw){while(task!null(taskgetTask())!null){w。lock();try{}finally{w。unlock();}}}
  判断条件getTask()死循环,拿到任务才返回如果线程超时或者大于核心线程数设置,释放线程。否则队列为空,则一直阻塞privateRunnablegetTask(){for(;;){intwcworkerCountOf(c);booleantimedallowCoreThreadTimeOutwccorePoolSize;略Runnablertimed?workQueue。poll(keepAliveTime,TimeUnit。NANOSECONDS):workQueue。take();if(r!null)returnr;略}}
  大于核心线程数时,会根据心跳时间释放队列的线程
  当小于等于核心线程数,会卡在workQueue。take()方法,直到拿到Runnable然后返回总结线程池的核心线程数,最大线程数,队列,线程间的关系?
  答:创建时,当小于核心线程数,无论队列是否有空闲线程,总会新建线程。当大于核心线程数,优先获取队列的空闲线程,当队列满了,则新建线程,如果大于最大线程数,则该任务被拒绝。
  自动销毁时,大于核心线程数,会根据KeepAliveTime时间,释放队列中的线程,直至线程数总数等于核心线程数,不再释放,核心线程数通过循环维持设置核心线程数,能大于最大线程数么?
  答:不能,看源码publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueRunnableworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler){if(corePoolSize0maximumPoolSize0maximumPoolSizecorePoolSizekeepAliveTime0)thrownewIllegalArgumentException();。。。。。}publicvoidsetMaximumPoolSize(intmaximumPoolSize){if(maximumPoolSize0maximumPoolSizecorePoolSize)thrownewIllegalArgumentException();。。。。。}释放线程时,怎样才能释放核心线程?
  allowCoreThreadTimeOut设置为true
  释放线程时,条件判断:privateRunnablegetTask(){。。。intwcworkerCountOf(c);Areworkerssubjecttoculling?allowCoreThreadTimeOut或者超过核心线程数booleantimedallowCoreThreadTimeOutwccorePoolSize;if((wcmaximumPoolSize(timedtimedOut))(wc1workQueue。isEmpty())){if(compareAndDecrementWorkerCount(c))returnnull;continue;}。。。}线程池为什么能维持线程不释放,随时运行各种任务?
  答:核心线程是在一系列的死循环里,通过队列阻塞保留。从而可以不断接受任务来进行死循环,拿到任务才返回如果线程超时或者大于核心线程数设置,释放线程。否则队列为空,则一直阻塞privateRunnablegetTask(){for(;;){intwcworkerCountOf(c);booleantimedallowCoreThreadTimeOutwccorePoolSize;略Runnablertimed?workQueue。poll(keepAliveTime,TimeUnit。NANOSECONDS):workQueue。take();if(r!null)returnr;略}}

2005年,夫妻携手捐献遗体,14年后重逢讲台,两架白骨并肩站昆明医科大学生命科学馆的入口处立着一对人体骨骸。生前,他们是一对恩爱夫妻,也是一对医学伉俪,一个出身贫寒的穷小子娶了贵小姐,风风雨雨57年。死后他们选择捐献遗体,再续前缘,依然并肩单骑五万里环游中国(19)漠河,浴火涅槃那天一出塔河,雨就开下。不是前天还听黑龙江省电视台的预报这几天全省都是好天气吗?看来又让人忽悠了。我记得我女儿考过我一道脑筋急转弯谁天天说谎话,人们也不怪他?我答不上来。气象台呗!躺平年龄不大,冒充老鬼年龄不大,冒充老鬼也不知这话出自何处,或许是句顺口溜。身为80后,年纪说大不大,说小也不小,心态上已有躺平的念头。每天活的浮浮沉沉,工作压力大节奏快,没有欲望,没有奔头,好像看淡了神仙句子文案迷失在莎士比亚的花园里,那里盛放着浪漫主义着的玫瑰光终究会散在我身上,我也会灿烂一场。,。不是神明不爱你,是世人蒙蔽了双眼,忘记了这不过一场繁华。我不懂什么年少轻狂,我只知道胜者为养老金统一按年龄分配,满55岁发3000,满60岁发4000元可行吗?养老金统一按年龄分配,满55岁发3000元,满60岁发4000元,可行吗?能实现吗?目前,城镇退休职工主要分为机关事业单位退休企业退休灵活就业退休几类,但是养老金却存在明显的差距究禅宗智慧局越大,越不纠缠智慧越高,越不贪婪真正有大模式的人非常清楚自己真正想要什么,掌握自己喜欢什么样的生活。每一个想法都集中在纠正自己的错误,升华自己,朝着目标前进。这种人越多,就越不会和坏人烂事。恶棍琐碎纠缠,不是因为方路好文分享时间是个好东西,它会在朝夕轮回间让你明白。这个世界没有什么是不能失去的,能留下的就尽力珍惜,得不到的都不是有多重要。人生犹如一本书,愚蠢的人将它草草翻过,聪明的人的人却会将它细细品自媒体上吹的冰,开卖立刻现原形荣耀X40GT大家好,我是小雷。荣耀X40gt发布已经一周,早就说要聊聊这款手机,但是媒体老师的测评我都不太信,吃人嘴短,拿人手软,改改数字,我也能理解。所以让子弹飞一会儿。前天这款手机开售,到5G创新发展高峰论坛,同看5G峰顶好风光5G创新发展高峰论坛主办工业和信息化部承办IMT2020(5G)推进组5G应用产业方阵通用技术邮电器材日期2022年12月6日地点国家会议中心C区一层多功能B厅活动背景作为PT展的思皓E10X外观设计E10X是思皓品牌正式属于江准汽车后推出的纯电动车型。在技术水平和设计上,德国VDA6。3质量管理体系全方位向合资品牌看齐,应用于制造和质量管理。与JAC时代的江淮新能源汽车相比,日系新能源车生死之年,ARIYA能否破除魔咒最近在路边打车的时候突然发现一个问题,这打过来打过去不是比亚迪的新能源就是其他国产品牌的新能源,很少再打到其他品牌的网约车了。不过转念一想,在如今新能源持续上涨的大背景下,中国势力
古代诛九族是指哪九族?为何犯人不选择逃跑?因为无处可逃人们常说,伴君如伴虎,在皇帝跟前伺候,那就是把脑袋别在了裤腰带上。皇帝开心,皆大欢喜,皇帝要是生气,那脑袋就得搬家。尤其是在喜怒无常的帝王手下做事,稍有不慎,就会惹祸上身,不仅自己中国历史上曾经灭掉过哪些国家各位朋友在浏览赏析之前给小编点点关注点点赞。中国是一个泱泱大国,地大物博,人杰地灵。在中国的历史上曾经有过很多的战争,有对内的也有对外的,而在这些战争中也有很多国家被中国灭亡,下面隋唐及五代时期的郧乡县秦楚刊号自隋文帝杨坚开皇元年(581),止于五代后周柴绍荣显德六年(959)共380年。这一时期郧乡县隶属变迁隋开皇元年(581)文帝杨坚代北周行施政权,九年(589)统一全国,建荀彧独具慧眼,在曹操尚无基业时主动投奔,为其指引方向刘备戎马大半生才遇见诸葛亮,而曹操在二次创业之初,便得到荀彧主动投奔,是何其幸运!颍川荀氏豫州颍川郡颍阴县(今许昌市)的荀家,是个以才学传家有名望,又子嗣繁盛的大家族。荀彧的爷爷荀上下五千年第二十九集战国风云之纸上谈兵的赵括第二十九集战国风云之纸上谈兵的赵括公元前262年,秦昭襄王派大将白起进攻韩国,占领了野王(今河南沁阳)。截断了上党郡(今山西长治)和韩都的联系,上党形势危急。上党的韩军将领不愿意投孙权正因射中猛虎而高兴时,张昭冷冷说道你不怕被天下人笑话?209年,喜欢打猎的孙权,正因射中了一只猛虎而沾沾自喜时,心腹谋臣张昭却极不捧场的打击孙权你不怕被天下人笑话吗?在天下纷纷的三国时期,君主打猎射虎,本是件很锻炼人的事情,可张昭为何春节期间,任泽平这样的高级知识分子,骂司马南有什么苦衷么经济学天空中有几朵乌云,不是什么大不了的事,物理学上空的乌云已经快把这座大厦给摧垮了,物理学家们不是照样喝酒泡妹妹?思想问题学术问题等,需要讨论辩论争论,那是一件好事,对人类的发展新旧在交替,15张50年代上色老照片,贫穷又落后但不怯全世界注照片信息来自原备注,如有误请告知,谢谢。本期照片均为后期上色,原照片为黑白色,上色的原因是为了让新生代的人们感受到老前辈们的鲜活,谢谢。1955年,一个幸福美满的工薪阶层家庭正在悼恭皇太子朱祐极他的存在证明一件事,万皇贵妃并没有残害皇嗣前言在大明王朝276年的历史中,要论被黑得最厉害的后妃,明宪宗万贵妃敢称第二,大概只有明神宗郑贵妃才敢自称第一。万贵妃生于宣德五年(公元1430年),和明宪宗朱见深的生母周氏年龄相中国不同层级科技创新中心的布局与政策建议中国网中国发展门户网讯新时代中国经济的发展动力逐步由传统生产要素投入出口拉动等向科技创新驱动转变,科技创新无疑成为中国经济发展的主引擎。在中华人民共和国国民经济和社会发展第十四个五退休养老金领1。4万元,是真的吗?高养老金怎样炼成的?四点建议退休老人的养老金能领多高呢?很多网友表示缴纳养老保险15年,养老金只有1000元。有的人是缴纳养老保险二三十年,退休养老金2000多元。养老金过万能不能行?可能是很多人想都不敢想象
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网