Java模拟Windows的Event
场景
开发中遇到一个场景,业务操作会不定时的产生工作任务,这些工作任务需要放入到一个队列中,而另外会有一个线程一直检测这个队列,队列中有任务就从队列中取出并进行运算。
问题
业务场景倒是简单,只不过这里会有一个问题,就是如果队列中没有数据那么线程就会一直扫描,这样就会浪费资源。
解决方法
在windows中有一个事件对象可以用于线程的控制,Event有两种状态:有信号和无信号,通过这个信号来做一个开关,可以达到线程的开关。在.net中有个AutoResetEvent类是实现这套方法的,但在java中我没有找到类似的实现,但是java并发包中有个Semaphore,那就通过这个Semaphore来完成吧。
怎么做
Semaphore可以设置信号量的数量,每一个信号量称为一个许可证,需要进行同步的线程向这个信号量对象获取许可证,获得成功则线程继续执行,如果没有许可证则会阻塞。我们这个场景下只要将信号量设置为1个许可证,然后通过控制这个许可证即可实现Event的效果。
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Semaphore; public class ThreadRunable {
private static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
private static Semaphore semp = new Semaphore(1); public static void main(String[] args) throws InterruptedException {
semp.acquire();//先占用信号量 Thread newThread = new Thread(new Worker());
newThread.start(); try {
Thread.sleep(1000);
queue.add("第1条数据");
semp.release();//放入数据放释放信号量,使得线程可以运行
System.out.println("可用许可证:" + semp.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(5000);
queue.add("第2条数据");
semp.release();//放入数据放释放信号量,使得线程可以运行
System.out.println("可用许可证:" + semp.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
} static class Worker implements Runnable { @Override
public void run() {
while (true) {
try {
semp.acquire();//获取许可证,如果没有可用许可证则阻塞 //业务代码,从队列中读数据做一些想干的事情
while (queue.isEmpty() == false) {
String value = queue.poll();
if (value != null && value != "") {
System.out.println("value: " + value);
}
} System.out.println("it's down.");
} catch (Exception e) {
}
}
} }
}
在段代码就是一个简单的模拟,实现的过程如下:
1、全局初始化信号量对象,设置一个许可证
2、首先占用许可证,使得线程在获取许可证时就会阻塞
3、然后模拟一些添加队列的数据,在添加队列的时候同时释放许可证,这样就可以唤醒线程了
4、线程唤醒后去读取队列并做一些操作,完成后又去尝试获取许可证
5、如果没有许可证则阻塞,直到下次有数据添加队列时再次释放许可证时再次唤醒线程
最后运行的结果:
可用许可证:1
value: 第1条数据
it's down.
可用许可证:1
value: 第2条数据
it's down.
Java模拟Windows的Event的更多相关文章
- Jsoup实现java模拟登陆
Jsoup实现java模拟登陆 2013-10-29 14:52:05| 分类: web开发|举报|字号 订阅 下载LOFTER我的照片书 | 1:如何获取cookies. 1.1 ...
- [Java] 模拟HTTP的Get和Post请求
在之前,写了篇Java模拟HTTP的Get和Post请求的文章,这篇文章起源与和一个朋友砍飞信诈骗网站的问题,于是动用了Apache的comments-net包,也实现了get和post的http请求 ...
- java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱
//如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...
- 上curl java 模拟http请求
最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...
- 使用Java模拟一个简单的Dos学生成绩管理系统:
使用Java模拟学生成绩管理系统... ------------------- 学生成绩管理系统:需要实现的功能:1.录入学生的姓名和成绩2.显示列表.列表中包括学生姓名与成绩3.显示最高分.最低分的 ...
- 浏览器与服务器交互原理以及用java模拟浏览器操作v
浏览器应用服务器JavaPHPApache * 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie, * 简单的讲,当浏 ...
- java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例
java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...
- Window对应的类为java.awt.Windows, 它可独立于其他Container而存在
Window对应的类为java.awt.Windows, 它可独立于其他Container而存在,它有两个子类, Frame和Dialog, Frame是具有标题(title)和可伸缩的角(resiz ...
- java模拟http的get和post请求
如题,使用Java模拟GET和POST请求.使用GET可以实现网页抓取,使用POST可以实现对某些网站登录的暴力破解.不过仅是练习,实际意义不大. import java.io.IOException ...
随机推荐
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 对抗假人 —— 前后端结合的 WAF
前言 之前介绍了一些前后端结合的中间人攻击方案.由于 Web 程序的特殊性,前端脚本的参与能大幅弥补后端的不足,从而达到传统难以实现的效果. 攻防本为一体,既然能用于攻击,类似的思路同样也可用于防御. ...
- TODO:Laravel 使用blade标签布局页面
TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...
- Android数据存储之Android 6.0运行时权限下文件存储的思考
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
- PHP之使用网络函数和协议函数
使用其他Web站点的数据 <html> <head> <title> Stock Quote From NASDAQ </title> </hea ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- 浅谈JSP中include指令与include动作标识的区别
JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- hbase集群安装与部署
1.相关环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章仅涉及hbase集群的搭建,关于hadoop与zookeeper的相关部 ...