|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
进而能拉拢大多数程序员用windows产品。并且从net网页编程网页编程AJAX可以跨平台这一点上,间接证明了我们的推断,至少证明了微软做过这方面的研究。所以如果哪一天突然听说了.net网页编程可以跨平台了,那么请不要吃惊,如果这一天真的到来,java就到了真正和.net网页编程决战的时刻。因为不到万不得以的时候微软是不会推出跨平台的.net网页编程的,如果跨平台的.net网页编程还不足以对抗java的话,那么微软还剩的手段就是开源了,呵呵。前段工夫,夜晚俄然收到报警,告急上线排查。因为dba操纵不妥,年夜片数据回滚,产生锁表的情形,哀求前往工夫太长,使得体系打印出大批的RejectedExecutionException的非常。定位到代码片断相似:
Java代码
- ThreadPoolExecutorworkers=newThreadPoolExecutor(10,600,30,TimeUnit.SECONDS,newArrayBlockingQueue<Runnable>(10));
- ShareTaskshareTask=newShareTask(shareInfo,clientId,rtnResult,
- outerShareContext,importOuterFriend,bindingManager,shareUserManager);
- workers.execute(shareTask);
这里就要说说ThreadPoolExecutor和ArrayBlockingQueue了,尽人皆知ArrayBlockingQueue类是一个堵塞的行列。当和ThreadPoolExecutor利用时,ThreadPoolExecutor会在初始化时开启corePoolSize(也就是下面代码中的10)个线程,往消耗行列里的task。当并发量增年夜,直到corePoolSize全都在实行task,而行列也放满了待处置的task的时分,ThreadPoolExecutor就会往创立一个新的线程。直至到达线程池中的消耗线程到达maximumPoolSize(也就是下面代码里的600)。假如这个时分再有task到场,依据默许的饱和战略,将会抛出RejectedExecutionException非常。
此次就是因为猎取数据库守候工夫超长,招致task呼应工夫变慢,继而线程池中活泼的消耗线程聚积到600个线程仍然没法对付,才抛出的RejectedExecutionException。
明显抛出RejectedExecutionException不是那末的友爱,我们在这里能够自界说饱和战略。默许体系饱和战略是抛出非常。
Java代码
- workers.setRejectedExecutionHandler(newRejectedExecutionHandler(){
- @Override
- publicvoidrejectedExecution(Runnabler,ThreadPoolExecutorexecutor){
- }
- });
别的当线程妨碍恢复时,经由过程日记惊异的察看到,行列中的线程以串行的体例运转了一短工夫,不外很快就一般了。因而在当地写了一个测试。
Java代码
- ThreadPoolExecutorworkers=newThreadPoolExecutor(10,100,3,TimeUnit.SECONDS,newArrayBlockingQueue<Runnable>(10));
- for(inti=0;i<110;i++){
- workers.execute(newRunnable(){
- @Override
- publicvoidrun(){
- try{
- Thread.sleep(1000);
- }catch(InterruptedExceptione){
- }
- thrownewRuntimeException();
- }
- });
- }
- while(true){
- try{
- Thread.sleep(500);
- }catch(InterruptedExceptione){
- }
- System.out.println(String.format(“taskcount:%s;activecount:%s”,workers.getTaskCount(),workers.getActiveCount()));
- }
运转如上的代码,打印日记以下:
Java代码
- taskcount:110;activecount:100
- taskcount:10;activecount:1
- taskcount:10;activecount:1
- taskcount:9;activecount:1
- taskcount:9;activecount:1
- …
- taskcount:2;activecount:1
- taskcount:2;activecount:1
- taskcount:1;activecount:1
- taskcount:1;activecount:1
能够看到,最初的10个task是以相似串行的体例在运转。
这里的缘故原由在于ThreadPoolExecutor的中止战略,当Runnable中抛出RTE时,ThreadPoolExecutor会将实行以后的Runnable的线程Dead。因为例子的代码100%会抛出RTE,终极的了局就是ThreadPoolExecutor中存活的消耗线程数变成0。ThreadPoolExecutor创立线程只要在初始化,挪用excute等几个自动办法中才会往做,我们义务的提交早在一入手下手就已做了,终极招致的了局就是永久只存在一个线程服务这个义务行列。
那末要对照文雅的办理这个成绩,可使用FutureTask,FutureTask内里会处置运转时非常,不会将其抛出给ThreadPoolExecutor。
手机用到的是用j2me所编出来的小程序。 |
|