1 打印日志: 原来打印16个日志需要16秒时间,现在开启4个线程,让这16个任务在4秒内完成:
思路: 0创建容量16的队列 1 将16个任务增加到 阻塞队列中 2开启4个线程,每次从队列中获取数据 这样主线程不停的放, 并发来的4个线程不停的取, 你可以理解为并发一次来了4个线程,每个线程取到后内部打印1S操作仍旧不变, 执行4次,一共耗时4S完成原来16秒不用并发下的操作 主线程放log 和 子线程取log 之间用condtion notEmpty notFull 来实现阻塞 public class Test { public static void main(String[] args){ // 0 创建容量只为1的队列 final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(16); // 2 开启4个线程,每次从队列中获取数据 for(int i=0;i<4;i++){ new Thread(new Runnable(){ @Override public void run() { while(true){ try { String log = queue.take(); parseLog(log); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } // 1 将16个任务在主线程中增加到阻塞队列中 System.out.println("begin:"+(System.currentTimeMillis()/1000)); for(int i=0;i<16;i++){ //这行代码不能改动 final String log = ""+(i+1);//这行代码不能改动 { try { queue.put(log); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Test.parseLog(log); } } } //parseLog方法内部的代码不能改动 public static void parseLog(String log){ System.out.println(log+":"+(System.currentTimeMillis()/1000)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
2 数据有序一个个输出:
package queue; import java.util.concurrent.Semaphore; import java.util.concurrent.SynchronousQueue; /** * 设计10个线程来消费 数据,要求达到 每次消费的数据是有序,并且是一个个的输出 * * 设计点: * 要求是 1 顺序输出 2 每次输出一个 * 1 守门员semaphore设置每次进来只有1个 * 2 使用阻塞队列SynchronousQueue,其特点就是只有在取数据线程来的时候,入数据线程才将数据放进去,类似于Exchanger作用,达到顺序输出效果 * @author zm * */ public class Test { public static void main(String[] args) { // 一个计数信号量。信号量维护了一个许可集,即每次进入的个数, 这里设置为每次只能进1个 final Semaphore semaphore = new Semaphore(1); final SynchronousQueue<String> queue = new SynchronousQueue<String>(); for(int i=0;i<10;i++){// 开启10个消费线程 new Thread(new Runnable(){ @Override public void run() { try { semaphore.acquire(); // 每次线程进来 都c从问守门员semaphore那获得申请 String input = queue.take(); String output = TestDo.doSome(input); System.out.println(Thread.currentThread().getName()+ ":" + output); semaphore.release(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } System.out.println("begin:"+(System.currentTimeMillis()/1000)); for(int i=0;i<10;i++){ //这行不能改动 String input = i+""; //这行不能改动 try { queue.put(input); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //不能改动此TestDo类 class TestDo { public static String doSome(String input){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } String output = input + ":"+ (System.currentTimeMillis() / 1000); return output; } }
相关推荐
包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)
jdk1.5.exe jdk1.5 jdk1.5下载
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
JDK1.5,JDK1.5
绝版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的最后一版
很实用的JAVA API中文参考文档,如果你开始讨厌HTML版本的API中文文档,试试这个吧,强大的索引功能使你开发更加愉快,分两卷,要都下了才能解压。
JDK1.5 API完整版JDK1.5 API完整版JDK1.5 API完整版
Java-jdk1.5安装包
“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-else 循环,自动装包/拆包,枚举,可变参数, 静态导入
详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明详细介绍java对象的使用和说明
Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm Jdk1.5Doc_CN.chm
jdk1.5压缩包 解压缩可用 用于Windows系统
jdk1.5 64位 windows版
JDK1.5+1.6整合版(文件为txt文件,里面有百度网盘下载地址<文件太大所以用网盘>) 文件里含有1.5和1.6两个版本的JDK,并且附有一环境变量创建办法以及切换版本方法
转载 jdk1.5的一些新特性,希望能帮助大家!