`
做一行爱一行吧
  • 浏览: 22473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java线程自己去取消息处理

    博客分类:
  • java
 
阅读更多

       这次说的就是想要线程自己去找事情做的一个方法,逻辑思想就是,当有人像我们的容器中放置一个新的消息,那么唤醒所有线程,这个时候取消息加锁并且位移+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){
		}
	}

}

        这中简单的小示例代码,经过我们的修改,可以制作成处理很复杂逻辑的代码版本,例如,我们将存储消息的数组加以分类,让线程按照类别去寻找消息处理等等!

分享到:
评论

相关推荐

    Java线程安全问题_动力节点Java学院整理

    不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。...JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm内存模型的基础上,如果解决多线程的可见性和有序性。

    JAVA线程安全及性能的优化

    不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。...JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm模型的基础上,如果解决多线程的可见性和有序性。

    Java-并发-Java线程中断与停止线程详解

      Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了中断标志...

    三缓冲区 多线程处理,抓包例子

    调锁调了蛮多时间.单线程序抓包,三个缓冲区, 默认三个线程进行处理.由于为了尽量保证包的顺序,三个线程同时只从一个缓冲区取数据

    异步处理(JAVA)

    能同时并发处理多个请求,并能按一定机制调度: 用一个队列来存放请求,所以只能按FIFO机制调度,你可以改用LinkedList,就可以简单实现一个优先级(优先级高的addFirst,低的addLast). 三.有能力将调用的边界从线程扩展到...

    Java多线程编程之限制优先级

    如何处理这些线程取决于基层的操作系统策略。在某些情况下,优先级相同的线程分时运行;在另一些情况下,线程将一直运行到结束。请记住,Java 支持 10 个优先级,基层操作系统支持的优先级可能要少得多,这样会造成...

    Java并发编程和多线程的区别

    并发编程: 并发编程是一种编程范式,它关注的是编写能够正确和...多线程允许程序同时执行多个任务,可以是并发执行或并行执行,具体取决于硬件和操作系统的支持。多线程通常用于提高程序的性能、响应性和资源利用率。

    Java高级程序设计-多线程(二).pptx

    第3章 多线程(二) Java 高级程序设计 Java高级程序设计-多线程(二)全文共34页,当前为第1页。 回顾 进程一般代表一个应用程序,一个进程中可以包含多个线程。 合理使用多线程能够提高程序的执行效率,处理高并发...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包4

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包3

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java源码包2

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    Java并发编程实战

    1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 第一部分 基础知识 第2章 线程安全性 2.1 什么是线程安全...

    第7章-JUC多线程v1.1.pdf

    JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    基于角色的消息传递框架Kilim.zip

    Task 可以发送 String 消息或者甚至自定义的消息类型,这完全取决于您自己。 在 Kilim 中,所有实体都通过方法签名捆绑在一起,如果您需要同时执行几项操作,可以在一个方法中指定该行为,扩大该方法的签名以抛出 ...

    Java并发编程(学习笔记).xmind

    (4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个事件分发线程(类似于中断响应函数)来替代主事件循环,当用户界面用有事件发生时,在事件线程中将调用对应的事件处理函数(类似于中断处理函数) ...

    JAVA 范例大全 光盘 资源

    实例121 取钱存钱(线程同步互斥) 354 实例122 谁唤醒了我(线程沉睡和唤醒) 357 实例123 让步传文件(线程让步) 359 实例124 爱子(守护线程) 361 实例125 有始有终(线程连接) 363 实例126 模拟下载文件...

Global site tag (gtag.js) - Google Analytics