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入门到精通教程
查看: 14610|回复: 0

多线程并发测试代码及解决方法

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

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-11 16:17:34 | 显示全部楼层 |阅读模式

    1.解决方法

    Executors.newSingleThreadExecutor()取得的Executor实例有以下特性:
    任务顺序执行. 比如:
    executor.submit(task1);
    executor.submit(task2);
    必须等task1执行完,task2才能执行。
    task1和task2会被放入一个队列里,由一个工作线程来处理。即:一共有2个线程(主线程、处理任务的工作线程)。
     
    以上如果是单机可以解决,如果是多台服务器的话,仍然还是会存在并发的问题.
    或者使用mysql数据库修改的特性,update排序依次来修改,增加否决字段,修改的时候带上条件值,可以解决并发问题.(多个租客租时间段重叠的同一辆车且自动接单,这个情况就很明显凸现出来.)

    2.测试代码

    /**
     * 
     */
    package mock;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    import com.autoyolConsole.util.esb.HttpUtils;
    
    /**
     * @author xxx
     * @function 
     * @date 2016年3月15日
     * @version 1.0
     */
    public class ConcurrentTest2 {
        private static int thread_num = 5;
        private static int client_num = 20;
        private static final String reqUrl = "http://10.0.3.213:7064/";
        private static String url = "tranxx/vxx/reqx";
        
        private static String[] tokens = new String[]{"4dafe25e1f8f4e368834f95b75030193","6a3d3702cccf46a3b94e2c805a16c0a3","a4ee5ad888714a9e9d0d4646e725495b","9adbecae26f648dea2767e8d908463dd","20910b477f0142f6b7f709babcdafb72",
            "c3c53c987256422a8667a455a1cd1117","efb1f941eab440619d8a339f2fafa429","786a901fe5414d14894ca4db738efe2f","8fbad92b9a7c4d4b8a420db23c405e49","75992aa62eb947739f0bfc8a83234584",
            "aa110a58ade241a3b456b8be5ddd2551","aa110a58ade241a3b456b8be5ddd255a","aa110a58ade241a3b456b8be5ddd2552","aa110a58ade241a3b456b8be5ddd2553","aa110a58ade241a3b456b8be5ddd2554",
            "aa110a58ade241a3b456b8be5ddd2555","aa110a58ade241a3b456b8be5ddd2556","aa110a58ade241a3b456b8be5ddd2557","aa110a58ade241a3b456b8be5ddd2558","aa110a58ade241a3b456b8be5ddd2559"};
        
        private static String[] mobiles = new String[]{"197xxxx9705","199xxxx5297","199xxxx8606","198xxxx9898","197xxxx1330",
            "197xxxx9999","193xxxx2233","193xxxx2345","191xxxx6712","198xxxx6852",
            "191xxxx6820","987xxxx0296","190xxxx7589","199xxxx8888","193xxxx2312",
            "199xxxx5496","161xxxx3280","190xxxx1082","199xxxx3724","199xxxx0537"};
        
        public static void main(String[] args) {
            ExecutorService exec = Executors.newCachedThreadPool();
            // thread_num个线程可以同时访问
            final Semaphore semp = new Semaphore(thread_num);
            // 模拟client_num个客户端访问
            for (int index = 0; index < client_num; index++) {
                final int NO = index;
                Runnable run = new Runnable() {
                    public void run() {
                        try {
                            // 获取许可
                            semp.acquire();
                            
                            System.out.println("Thread并发事情>>>"+ NO);
                            
                            String strReq = "{\"carNo\":\"303473636\",\"token\":\""+tokens[NO]+"\",\"conPhone\":\""+mobiles[NO]+"\","
                                    + "\"rentTime\":\"20160519183000\",\"revertTime\":\"20160522183000\",\"rentReason\":\"上下班用车\",\"oilType\":\"1\",\"disCouponIds\":\"0\",\"useBal\":\"0\",\"source\":\"3\",\"rentCity\":\"本市\"}";
                            
                            try {
                                String result = HttpUtils.appPost(strReq, reqUrl+ url);
                                System.err.println("接口调用返回结果:" + result);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            
                            semp.release();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                exec.execute(run);
            }
            // 退出线程池
            exec.shutdown();
        }
    }

     

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-12-23 05:21 , Processed in 0.215709 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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