近期考虑采用Java多线程实现给用户发短信的功能。自己做了一个简单的demo。

demo需求如下:通过界面输入用户名、密码、手机号,点击添加,即可实时的为该用户发一条短信。

实现过程如下:

2、点击“添加”,通过ajax将参数传给后台。$.ajax({

type: "post",

url:"/test/addTestUserToQue",

contentType: "application/json;charset=UTF-8",//指定消息请求类型

dataType: "json",

data:JSON.stringify({

"name":$("#name").val(),

"password":$("#password").val(),

"phone":$("#phone").val()

}),

success:function (result){

if (result.msg=="OK"){

console.log("用户添加队列成功!")

}

},

error:function (result){

console.log("data-msg:"+result.msg);

}

注意:(1)contentType:"application/json;charset=UTF-8"这个必须加上,当时因为没有加,一直请求不到后台。

(2)data属性的值是通过JSON.stringify()来转换的。

3、controller层-后台接收方法如下:public JSONResult addTestUserToQue(@RequestBody TestUser testUser){

testUserService.addTestUserToQue(testUser);

return JSONResult.ok(testUser);

}

4、service层是具体的逻辑。会把该条用户信息加到对应的线程队列中。public void addTestUserToQue(TestUser testUser) {

System.out.println("添加用户进队列service--begin--");

System.out.println("手机号最后一位:"+testUser.getPhone().substring(10));

ConcurrentLinkedQueue linkedQueue = Xproducer.taskMap.get(testUser.getPhone().substring(10));

if (linkedQueue==null){

System.out.println("linkedQueue == null,需新建");

linkedQueue = new ConcurrentLinkedQueue();

}

linkedQueue.add(testUser);

Xproducer.taskMap.put(testUser.getPhone().substring(10),linkedQueue);

System.out.println("添加用户进队列service--end--");

}

5、新建一个线程类,实现发短信的效果。该线程类中需要定义一个线程池,线程池必须是静态变量,作为类的成员。public static ConcurrentHashMap> taskMap = new ConcurrentHashMap<>();

线程类里需重写run方法。线程实现的效果就是不断的从线程池队列中取出用户信息,逐条给用户发短信。while (true){

ConcurrentLinkedQueue linkedQueue = taskMap.get(mode);

if(null!=linkedQueue&&linkedQueue.size()>0) {

System.out.println("linkedQue不空,取出用户手机号,准备发短信");

TestUser testUser = linkedQueue.poll();

if (null != testUser){

System.out.println("给用户" + testUser.getName() + "发短信完毕");

}

}else {

ConcurrentLinkedQueue linkedQueue = taskMap.get(mode);

if(null!=linkedQueue&&linkedQueue.size()>0) {

TestUser testUser = linkedQueue.poll();

if(null!=testUser){

System.out.println("给用户"+testUser.getName()+"发短信");

}

}else{

Thread.sleep(1000);

}

}

}

6、service层实现接口InitializingBean。通过重写afterPropertiesSet()方法,实现程序预加载。预加载时开启多个线程类,相当于做一个初始化。for (int i=0; i

Xproducer xproducer = SpringUtil.getBean(Xproducer.class);

xproducer.setMode(i+"");

xproducer.setThreadName("thread"+i);

Thread thread = new Thread(xproducer);

thread.start();

}

功能执行过程解析:

启动项目之后,系统加载service之后,会自动调用afterPropertiesSet()方法,开启多个线程类Xproducer。此时每个线程都会执行run方法。此时每个线程里面的线程队列都是空的,所以每个线程都会执行Thread.sleep()方法,处于阻塞状态。

如果此时通过界面输入一条用户信息,点击“添加”之后,系统会把该用户信息添加到对应的线程中的队列中。例如添加到了0号线程的线程队列。那么0号线程此时再次判定队列不为空时就会执行相应的发送短信的功能。

本功能的重点在于service实现了接口InitializingBean的afterPropertiesSet()方法。该方法中,通过getBean方法可以得到线程类。

需要注意的是:SpringUtil类必须在service类之前被加载,否则getBean()会报NUll的错误。通过在启动类中添加扫描注解来实现。如下,我们把SpringUtil类放到jar文件夹下,那么系统启动的时候,就会先扫描jar下的文件,然后再扫描com下面的文件,保证SpringUtil先于Service之前被加载@SpringBootApplication(scanBasePackages = {"jar","com"})

java线程 demo_Java多线程demo相关推荐

  1. java线程池多线程优先级_Java线程优先级

    java线程池多线程优先级 Priority of a thread describes how early it gets execution and selected by the thread ...

  2. java线程wait_java多线程学习(四) 之 wait和notify

    ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...

  3. Java线程之多线程与多进程(3)——Java中的多线程

    单线程 任何程序至少有一个线程,即使你没有主动地创建线程,程序从一开始执行就有一个默认的线程,被称为主线程,只有一个线程的程序称为单线程程序.如下面这一简单的代码,没有显示地创建一个线程,程序从mai ...

  4. java线程跟多线程

    java创建线程两种方式: 1.继承Thread创建线程 /*** Created by lsf on 16/4/18.*/ class NewThread extends Thread {NewTh ...

  5. 什么是java线程_Java多线程是什么意思?

    展开全部 Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多636f707932313 ...

  6. 【Java线程】多线程实现简单的一对一聊天

    实现原理: 1.主方法:在主方法中构建一个输入流接收键盘的输入,根据接收到的输入信息判定角色是服务器端还是客户端:然后构建相应的socket,开启线程: 2.线程-坚守键盘阵地:接收键盘的输入,将从键 ...

  7. Java线程之多线程与多进程(1)——以操作系统的角度述说线程与进程

    任务调度 线程是什么?要理解这个概念,须要先了解一下操作系统的一些相关概念.大部分操作系统(如Windows.Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强 ...

  8. java 线程(多线程)thread,案例:汉字打字练习(AWT-EventQuecue,AWT-Windows)

    实验目的 当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue和 AWT-Windows. AWT-Ev ...

  9. Java线程之多线程与多进程(2)——线程优先级与线程安全

    线程优先级 现在主流操作系统(如Windows.Linux.Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外,还有优先级调度(Priority Schedule)的特点.优先级调度决定 ...

最新文章

  1. python基础/编程语言,解释器和pycharm的安装
  2. [NOI2004]郁闷的出纳员
  3. 直播预告:基于动态词表的对话生成研究 | PhD Talk #21
  4. mysql复杂操作,.Net Core+mySqlSugar的一些稍复杂操作
  5. 【大话设计模式】设计模式系统学习大合集
  6. 降低网络拥塞,追求美好体验——对话拍乐云首席科学家章琦
  7. Laravel 学习笔记之 Query Builder 源码解析(下)
  8. Java 原生 JDBC 代码操作演示
  9. 《ARM Cortex-M3权威指南》--语句摘要
  10. 大众点评有多少用户2019_据说2019年度大众点评排名第一
  11. 模式分解的无损性判断
  12. 仿网易严选Flutter项目
  13. php 中文逗号 转英文,PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式...
  14. ROM RAM FLASH说明
  15. python to csv参数_pandas的to_csv()使用方法
  16. leetcode 36. 有效的数独 (将 9 * 9 数独划分成 9 宫格 )
  17. 数据分析学习记录(五)--Paired Comparison Plot App插件的使用
  18. 旋转卡壳凸包(不用一下子就学完所有)
  19. DQN 强化学习 (Reinforcement Learning)
  20. HTML“计算机输出”标签 codekbdsampttvarpre

热门文章

  1. PowerShell在Exchange2010下快速开启邮箱
  2. Android 亲测源码分享
  3. 现任明教教主共享胖AP与WLC安全配置录像.上半部分
  4. MySQL中文参考手册-- 常用查询的例子
  5. IPv6改造三步曲——Vecloud
  6. Python连接MYSQL,并做查询操作
  7. luogu P3379 【模板】最近公共祖先(LCA)
  8. HTML第三课——css盒子
  9. ZOJ 3776 A - Pokemon Master 签到水题
  10. PHP 基础知识-数组