这次说的就是想要线程自己去找事情做的一个方法,逻辑思想就是,当有人像我们的容器中放置一个新的消息,那么唤醒所有线程,这个时候取消息加锁并且位移+1,然后处理线程自己思考是否还有消息应该处理,如果没有进入等待空间,如果有责继续处理!
(这种处理思想是考虑到线程共享内存的原理,否则是无法实现的)
package threadtest2; public class Main { public static void main(String[] args){ Channel channel = new Channel(5); //生成一个新的channel对象,设置容器线程量为5 channel.startWorkers(); //开始所有的工作线程 new ClientThread("Alice", channel).start(); //启动客户端模拟器来放置消息 new ClientThread("Bobby", channel).start(); //同上 new ClientThread("Chris", channel).start(); //同上 } }
package threadtest2; public class Main { public static void main(String[] args){ Channel channel = new Channel(5); //生成一个新的channel对象,设置容器线程量为5 channel.startWorkers(); //开始所有的工作线程 new ClientThread("Alice", channel).start(); //启动客户端模拟器来放置消息 new ClientThread("Bobby", channel).start(); //同上 new ClientThread("Chris", channel).start(); //同上 } }
这类的代码其实都是简单
package threadtest2; import java.util.Random; public class Request { private final String name; //委托者名称 private final int number; //请求编号 private static final Random random = new Random(); //生成一个随机数 public Request(String name, int number){ this.name = name; this.number = number; } /**work线程调用使用的解决方法,就是简单的显示**/ public void execute(){ System.out.println(Thread.currentThread().getName() + "executes" + this); try{ Thread.sleep(random.nextInt(1000)); }catch(InterruptedException e){ } } public String toString(){ return "[ Request from]" + name + "No." + number +"]"; } }
package threadtest2; import java.util.Random; public class Request { private final String name; //委托者名称 private final int number; //请求编号 private static final Random random = new Random(); //生成一个随机数 public Request(String name, int number){ this.name = name; this.number = number; } /**work线程调用使用的解决方法,就是简单的显示**/ public void execute(){ System.out.println(Thread.currentThread().getName() + "executes" + this); try{ Thread.sleep(random.nextInt(1000)); }catch(InterruptedException e){ } } public String toString(){ return "[ Request from]" + name + "No." + number +"]"; } }
package threadtest2; import java.util.Random; /**模拟客户端发送请求**/ public class ClientThread extends Thread{ private final Channel channel; //创建处理模块实例 private static final Random random = new Random(); //生成随机数 public ClientThread(String name, Channel channel){ super(name); //继承线程类构造方法 this.channel = channel; } /**实现run方法**/ public void run(){ try{ /**该进程一直递增,并调用channel put方法来放置新的消息进去,然后随机休眠等待**/ for(int i = 0; true; i++){ Request request = new Request(getName(), i); channel.putRequest(request); Thread.sleep(random.nextInt(1000)); } }catch(InterruptedException e){ } } }
这中简单的小示例代码,经过我们的修改,可以制作成处理很复杂逻辑的代码版本,例如,我们将存储消息的数组加以分类,让线程按照类别去寻找消息处理等等!
相关推荐
不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。...JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm内存模型的基础上,如果解决多线程的可见性和有序性。
不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。...JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm模型的基础上,如果解决多线程的可见性和有序性。
Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了中断标志...
调锁调了蛮多时间.单线程序抓包,三个缓冲区, 默认三个线程进行处理.由于为了尽量保证包的顺序,三个线程同时只从一个缓冲区取数据
能同时并发处理多个请求,并能按一定机制调度: 用一个队列来存放请求,所以只能按FIFO机制调度,你可以改用LinkedList,就可以简单实现一个优先级(优先级高的addFirst,低的addLast). 三.有能力将调用的边界从线程扩展到...
如何处理这些线程取决于基层的操作系统策略。在某些情况下,优先级相同的线程分时运行;在另一些情况下,线程将一直运行到结束。请记住,Java 支持 10 个优先级,基层操作系统支持的优先级可能要少得多,这样会造成...
并发编程: 并发编程是一种编程范式,它关注的是编写能够正确和...多线程允许程序同时执行多个任务,可以是并发执行或并行执行,具体取决于硬件和操作系统的支持。多线程通常用于提高程序的性能、响应性和资源利用率。
第3章 多线程(二) Java 高级程序设计 Java高级程序设计-多线程(二)全文共34页,当前为第1页。 回顾 进程一般代表一个应用程序,一个进程中可以包含多个线程。 合理使用多线程能够提高程序的执行效率,处理高并发...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 第一部分 基础知识 第2章 线程安全性 2.1 什么是线程安全...
JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...
Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...
Task 可以发送 String 消息或者甚至自定义的消息类型,这完全取决于您自己。 在 Kilim 中,所有实体都通过方法签名捆绑在一起,如果您需要同时执行几项操作,可以在一个方法中指定该行为,扩大该方法的签名以抛出 ...
(4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个事件分发线程(类似于中断响应函数)来替代主事件循环,当用户界面用有事件发生时,在事件线程中将调用对应的事件处理函数(类似于中断处理函数) ...
实例121 取钱存钱(线程同步互斥) 354 实例122 谁唤醒了我(线程沉睡和唤醒) 357 实例123 让步传文件(线程让步) 359 实例124 爱子(守护线程) 361 实例125 有始有终(线程连接) 363 实例126 模拟下载文件...