Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 370|回复: 0

java中异步多线程超时导致的服务异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-9 19:02:25 | 显示全部楼层 |阅读模式

      在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值。

          当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空。其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的。很简单,就是因为阻塞的那个线程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态。

          附上一段自己写的调试代码,当想不出问题的时候,自己模拟的写写,说不定问题就出来了。

          

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    public class FutureTest
    {
    
        public static void main(String[] args) throws InterruptedException,
            ExecutionException, TimeoutException
        {
    
            final ExecutorService exec = Executors.newFixedThreadPool(1);
            
    
            Callable<String> call = new Callable<String>() {
                public String call() throws InterruptedException
                {
                    // 开始执行耗时操作
                        Thread.sleep(1000 * 2); 
                    return "1线程执行完成.";
                }
            };
    
            Callable<String> call2 = new Callable<String>() {
                public String call() throws Exception
                {
                    // 开始执行耗时操作
                    // Thread.sleep(1000 * 5);
                    return "2线程执行完成.";
                }
            };
            
            Callable<String> call3 = new Callable<String>() {
                public String call() throws Exception
                {
                    // 开始执行耗时操作
                    // Thread.sleep(1000 * 5);
                    return "3线程执行完成.";
                }
            };
    
            Future<String> future = exec.submit(call);
            Future<String> future3 = exec.submit(call3);
             Future<String> future2 = exec.submit(call2);
                String obj="";
                String obj2 ="";
                String obj3 ="";
                try{
                 obj = future.get(500, TimeUnit.MILLISECONDS); // 任务处理超时时间设为
                }// 1 秒
                catch(Exception e){
                    System.out.println("处理超时啦....");
                    e.printStackTrace();
                }
                
                try{
                    obj3 = future3.get(3000, TimeUnit.MILLISECONDS); // 任务处理超时时间设为
                   }// 1 秒
                   catch(Exception e){
                       System.out.println("处理超时啦....");
                       e.printStackTrace();
                   }
                
                try{
                 obj2 = future2.get(3000, TimeUnit.MILLISECONDS);}
                catch(Exception e){
                    System.out.println("处理超时啦....");
                    e.printStackTrace();
                }
                System.out.println("3任务成功返回:" + obj3);
                System.out.println("2任务成功返回:" + obj2);
                System.out.println("1任务成功返回:" + obj);
                exec.shutdown();
            }  
    }

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-2 11:09 , Processed in 0.059757 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表