`

jdk1.5——阻塞队列应用案例

 
阅读更多
 

 

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 windows版本 64位

    此外,JDK 1.5还引入了新的编译器——Client Compiler和Server Compiler,根据不同的场景选择合适的编译策略,提升代码执行速度。 总结,JDK 1.5的64位Windows版本为Java开发者提供了在64位系统上开发和运行Java...

    jdk1.5x64位 windows版.zip

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK1.5是Java的一个重要版本,它在2004年9月30日正式发布,也被称为Java 5.0。这个版本引入了...

    linux系统jdk1.5下载

    然而,对于某些老旧的应用或者特定环境的需求,JDK1.5仍然是必要的。 在Linux系统上安装JDK1.5的过程与现代版本略有不同,主要依赖于RPM(Red Hat Package Manager)包管理器。`jdk-1_5_0_22-linux-amd64.rpm`文件...

    Java-jdk1.5安装包

    Java JDK(Java Development Kit)是Java编程语言的开发环境,它是Oracle公司提供的用于编写、调试和运行Java应用程序的工具集合。JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java...

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    JDK1.5,JDK1.5

    JDK1.5,全称Java Development Kit 1.5,是Java平台标准版(Java SE)的一个重要版本,由Sun Microsystems在2004年9月30日正式发布。这个版本引入了大量的新特性,对Java编程语言进行了重大改进,极大地提升了开发...

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,...

    window JDK1.5 32位 绿色免安装版,可以安装多个JDK使用

    **Java Development Kit (JDK) 1.5 32位版详解** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的重要工具集。标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统...

    jdk 1.5 linux (共三个文件)之一

    测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin

    详细介绍JDK1.5的各种新特性

    8. **NIO.2(New I/O 2)**:虽然NIO(非阻塞I/O)是在JDK1.4引入的,但JDK1.5对其进行了扩展,添加了文件系统操作和文件观察者等功能,使得文件操作更加高效和灵活。 9. **类型安全的异常检查(Checked Exceptions...

    IBM_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    在AIX系统中进行开发工作时,IBM JDK 1.5扮演着至关重要的角色,因为它提供了必要的Java编程接口(API)和JVM(Java虚拟机)来运行和编译Java应用程序。 IBM JDK 1.5主要包含了以下几个关键组件: 1. **JVM (Java ...

    JDK1.5最终版全平台下载

    JDK1.5 全平台安装包下载 百度网盘资源 jdk-1_5_0_22-linux-amd64-rpm.bin jdk-1_5_0_22-linux-amd64.bin jdk-1_5_0_22-linux-i586-rpm.bin jdk-1_5_0_22-linux-i586.bin jdk-1_5_0_22-solaris-amd64...

    linux下JDK1.5

    在Linux环境下,Java Development Kit(JDK)1.5是Java编程语言的重要组成部分,它提供了必要的工具和库,使得开发者能够在Linux系统上进行Java应用程序的开发、编译、调试以及运行。本文将深入探讨Linux下JDK1.5的...

    jdk1.5 windows 64位官方正式版,绝对有效

    另外,JDK1.5还对I/O流进行了改进,引入了NIO(非阻塞I/O)框架,提供了通道(Channels)和缓冲区(Buffers)的概念,提高了读写操作的效率,尤其适用于高并发的网络应用。 总的来说,JDK1.5对Java语言做了大量的...

    IBMJDK1.5linux.zip

    在并发编程方面,JDK 1.5引入了并发工具类(java.util.concurrent package),如Executor框架、Semaphore、CountDownLatch和CyclicBarrier等,这些工具大大简化了多线程编程,提高了并发应用的效率和可靠性。...

    jdk1.5.zip 免费分享,哈哈

    在本案例中,我们讨论的是JDK 1.5,也被称为Java SE 5.0,这是一个里程碑式的版本,发布于2004年9月30日。它引入了许多重要的新特性,对Java编程产生了深远的影响。 1. Generics(泛型):JDK 1.5最重要的特性之一...

    历史版本JDK1.5安装包

    Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一个完整的Java运行环境(JRE)以及开发...尽管随着时间的推移,更高级别的JDK版本不断发布,但JDK 1.5在某些特定场景下仍然有着其独特的价值和应用。

    JDK1.5、JDK5下载

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK1.5,也被称为JDK 5.0,是一个重要的版本,它引入了许多创新特性,显著提升了开发效率和...

Global site tag (gtag.js) - Google Analytics