- 浏览: 1363678 次
- 性别:
- 来自: 江西
文章分类
- 全部博客 (287)
- oracle (30)
- Java (73)
- MySQL (16)
- Myeclipse/eclipse (12)
- javascript (15)
- JSP/Servlet (7)
- maven (14)
- AJAX (2)
- JQuery (9)
- tomcat (8)
- spring (21)
- Linux (28)
- PHP (9)
- UI (1)
- 编程错误及处理 (38)
- 多线程 (18)
- hibernate (10)
- Web Service (3)
- struts2 (6)
- log4j (3)
- SVN (4)
- DWR (1)
- lucene (1)
- 正则表达式 (4)
- jstl (2)
- SSL (3)
- POI (1)
- 网络编程 (1)
- 算法 (2)
- xml (4)
- 加密解密 (1)
- IO (7)
- jetty (2)
- 存储过程 (1)
- SQL Server (1)
- MongoDB (1)
- mybatis (1)
- ETL (1)
- Zookeeper (1)
- Hadoop (5)
- Redis (1)
- spring cloud (1)
最新评论
-
ron.luo:
牛逼,正解!
maven设定项目编码 -
lichaoqun:
java.sql.SQLException: Can't call commit when autocommit=true -
Xujian0000abcd:
Thanks...
Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the clas -
renyuan2ni:
[i][b][u]引用[list]
[*][img][flas ...
Manual close is not allowed over a Spring managed SqlSession -
851228082:
宋建勇 写道851228082 写道<!-- 文件拷贝时 ...
maven设定项目编码
package cn.com.songjy.test.socket.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * * ClassName:ConditionCommunication * jdk1.5条件阻塞Condition的应用(通信) * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次 * * @author songjy * @version 1.0 * @since v1.0 * @Date 2013-8-22 下午2:22:53 */ public class ConditionCommunication { public static void main(String[] args) { final Businese businese = new Businese(); new Thread(new Runnable() { public void run() { for (int j = 0; j < 50; j++) { businese.sub(j); } } }).start(); for (int j = 0; j < 50; j++) { businese.main(j); } } static class Businese { private static Log log = LogFactory.getLog(Businese.class); private boolean sub = true; private Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public /*synchronized*/ void sub(int j) {/*synchronized被Lock代替*/ lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (!sub) {// 还没有轮到我(sub),继续等待(睡觉) try { //wait(); condition.await();/*代替wait(),但切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 10; i++) { log.info("sup thread sequence of" + i + "loop of " + j); } sub = false;// 执行完毕,变更状态 //notify();// 本次执行完毕,唤醒其他线程(main) condition.signal();/*代替notify()*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//最终必须释放锁,即使程序出错! } } public /*synchronized*/ void main(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (sub) {// 还没有轮到我(main),继续等待(睡觉) try { //wait(); condition.await();/*代替wait(),但切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 100; i++) { log.info("main thread sequence of" + i + "loop of " + j); } sub = true;// 执行完毕,变更状态 //notify();// 本次执行完毕,唤醒其他线程(sub) condition.signal();/*代替notify()*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//即使程序出错也必须释放锁 } } } } /*备注:wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承、且不允许重写的方法*/
package cn.com.songjy.test.socket.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * * ClassName:ConditionCommunication * jdk1.5条件阻塞Condition的应用(通信) * 子线程1循环5次,接着子线程2循环10次,最后主线程循环15次,接着又回到子线程1循环5次,接着子线程2循环10次,最后主线程循环15次,如此循环10次 * * @author songjy * @version 1.0 * @since v1.0 * @Date 2013-8-22 下午2:22:53 */ public class ThreeConditionCommunication { public static void main(String[] args) { final Businese businese = new Businese(); new Thread(new Runnable() { public void run() { for (int j = 0; j < 10; j++) { businese.sub1(j); } } }).start(); new Thread(new Runnable() { public void run() { for (int j = 0; j < 10; j++) { businese.sub2(j); } } }).start(); for (int j = 0; j < 10; j++) { businese.main(j); } } static class Businese { private static Log log = LogFactory.getLog(Businese.class); private int sub = 0; private Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); public void sub1(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (0 != sub) {// 还没有轮到我(sub1),继续等待(睡觉) try { condition1.await();/*切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 5; i++) { log.info("sup1 thread sequence of" + i + "loop of " + j); } sub = 1;// 执行完毕,变更状态 condition2.signal();/*唤醒sub2线程*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//最终必须释放锁,即使程序出错! } } public void sub2(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (1 != sub) {// 还没有轮到我(sub2),继续等待(睡觉) try { condition2.await();/*切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 10; i++) { log.info("sup2 thread sequence of" + i + "loop of " + j); } sub = 2;// 执行完毕,变更状态 condition3.signal();/*唤醒main线程*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//最终必须释放锁,即使程序出错! } } public void main(int j) { lock.lock(); try { /* 这里用while不用if是因为有可能出现假唤醒的情况 */ while (2 != sub) {// 还没有轮到我(main),继续等待(睡觉) try { //wait(); condition3.await();/*切记不要误写成condition.wait()*/ } catch (InterruptedException e) { log.error(e.getMessage(), e); } } for (int i = 0; i < 15; i++) { log.info("main thread sequence of" + i + "loop of " + j); } sub = 0;// 执行完毕,变更状态 condition1.signal();/*唤醒sub1线程*/ } catch (Exception e) { log.error(e.getMessage(), e); } finally { lock.unlock();//即使程序出错也必须释放锁 } } } } /*备注:wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承、且不允许重写的方法*/
package cn.com.songjy.test.socket.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * ClassName:BoundedBuffer * 缓冲模拟(不是缓存) * * @author songjy * @version 1.0 * @since v1.0 * @Date 2013-8-23 上午9:40:18 */ class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); return x; } finally { lock.unlock(); } } }
来自:http://down.51cto.com/data/443438
发表评论
-
java.io.NotSerializableException: java.util.ArrayList$SubList
2016-03-15 11:36 2776错误信息: 原代码: if (null != dto ... -
java.lang.NoSuchMethodError
2015-10-30 19:50 1076在执行命令 java -Djava.ext.dirs=./de ... -
OutOfMemoryError
2015-01-07 10:49 628错误信息: 执行命令(修改前): java -Djava. ... -
自定义ClassLoader
2014-12-14 17:13 852一、自定义类加载器代码: package foo; im ... -
ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭
2014-04-29 13:03 19494看到一个博客,如下 Jav ... -
URL传递中文参数乱码问题
2014-03-14 12:55 1109项目特殊要求,form表单使用get方式提交,由此出现了中文乱 ... -
Java使用正则进行奇偶替换
2013-12-30 11:20 1549/** * 将位于偶数位的数字1替换为2 */ ... -
Java调用ping命令
2013-11-26 10:26 3616package cn.com.songjy; impor ... -
Linux开机启动Java程序
2013-11-25 15:26 3526一、编写启动Java程序shell脚本(smssend.sh) ... -
单例模式
2013-11-05 09:58 751Java之美[从菜鸟到高手演变]之设计模式 Java开发中 ... -
判定2个对象相等之重写equals方法
2013-10-18 11:03 1046package cn.com.songjy.test; ... -
SAX解析XML文件示例
2013-09-13 17:32 1003package cn.com.songjy.test.xml; ... -
二分查找算法(Binary Search)
2013-09-13 17:01 2366项目中遇到需要从数组中查找数据,但是算法很多,于是根据项目需求 ... -
Iterate over rows and cells(EXCEL文件的读取)
2013-09-13 14:13 4049package cn.com.songjy.test.exce ... -
jdk1.5的Exchanger同步工具
2013-08-27 14:04 645package cn.com.songjy.test.sock ... -
jdk1.5的CountDownLatch同步工具
2013-08-27 13:37 752package cn.com.songjy.test.sock ... -
jdk1.5的Semaphere同步工具
2013-08-23 14:20 1050package cn.com.songjy.test.so ... -
jdk1.5读写锁技术的妙用
2013-08-19 22:00 1354/** * ReadWriteLockTest.java ... -
jdk1.5的线程锁技术
2013-08-19 20:25 924/** * LockTest.java * cn.co ... -
Callable与Future的应用
2013-08-19 20:03 1027/** * CallableAndFuture.java ...
相关推荐
包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)
jdk1.5.exe jdk1.5 jdk1.5下载
JDK1.5,JDK1.5
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
JDK 1.5新特性及应用JDK 1.5新特性及应用JDK 1.5新特性及应用
jdk1.5.0.22 是jdk1.5的最后一版,jdk1.5 windows 64位官方正式版,绝对有效,jdk1.5 windows 64位官方正式版,绝对有效
jdk 1.5 中文 api chm jdk 1.5 中文 api chm
jdk1.5.0.22 是jdk1.5的最后一版
JDK1.5 API完整版JDK1.5 API完整版JDK1.5 API完整版
很实用的JAVA API中文参考文档,如果你开始讨厌HTML版本的API中文文档,试试这个吧,强大的索引功能使你开发更加愉快,分两卷,要都下了才能解压。
详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明
Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm
“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-else 循环,自动装包/拆包,枚举,可变参数, 静态导入
jdk1.5压缩包 解压缩可用 用于Windows系统
JDK1.5+1.6整合版(文件为txt文件,里面有百度网盘下载地址<文件太大所以用网盘>) 文件里含有1.5和1.6两个版本的JDK,并且附有一环境变量创建办法以及切换版本方法
Java-jdk1.5安装包
转载 jdk1.5的一些新特性,希望能帮助大家!
jdk1.5 64位 windows版