并发包消息队列BlockingQueue与反射api
来源:互联网 发布:微淘和淘宝的区别 编辑:程序博客网 时间:2024/06/05 06:50
1、并发包消息队列BlockingQueue
java.util.concurrent.BlockingQueue是并发包下控制线程同步的工具。既然是队列那么其主要的方法当然为入队(push)、出队(pop),这里入队方法有:add、offer、put(阻塞式),出队方法有:pull、take(阻塞式)
- add(Obj):该入队方法会在队列满的时候抛出异常。
- offer(Obj):如过队列没满能成功入队的话,返回true,如果队列满的话,那么返回false。
- put(Obj):入队的时候如果队列满的话,那么会进入阻塞状态,直到有消息出队该对象再入队。
- pull(time):出队方法,如果队列内容为空,再等待time时间,取不到那么返回null值。
- take():出队方法,如果队列内容为空,那么进入阻塞状态持续等待,直到有消息入队。
由于BlockingQueue是个接口,通常会使用它的两个实现类,一个是ArrayBlockingQueue一个是LinkedBlockingQueue。
1、ArrayBlockingQueue:一个由数组支持的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的。
2、LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的
生产者与消费者实例:
public class Producer implements Runnable{ public BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { super(); this.queue = queue; } @Override public void run() { try { Thread.sleep(300); String name = Thread.currentThread().getName(); System.out.println(name+"正在入队"); queue.put(name); } catch (InterruptedException e) { e.printStackTrace(); } }}
public class Consumer implements Runnable{ public BlockingQueue<String> queue; public Consumer(BlockingQueue<String> queue) { super(); this.queue = queue; } @Override public void run() { try { Thread.sleep(200); String name = Thread.currentThread().getName(); System.out.println(name); String message = queue.take(); System.out.println(message+"出队完成"); } catch (InterruptedException e) { e.printStackTrace(); } }}
public class QueueTest { static BlockingQueue<String> queue = new ArrayBlockingQueue<>(2); public static void main(String[] args) { Producer producer = new Producer(queue); Consumer consumer = new Consumer(queue); for (int i=0;i<3;i++){ new Thread(producer,"消息线程"+i).start(); } for (int i=0;i<5;i++){ new Thread(consumer,"consumer"+i).start(); } }}
其中一次的输出结果
consumer2consumer3consumer4consumer0consumer1消息线程1正在入队消息线程2正在入队消息线程0正在入队消息线程1出队完成消息线程0出队完成消息线程2出队完成
注:入队的时候休眠是为了让所有消息入队(队列一次最多只能存入两个消息,消息线程0此时是进入阻塞状态等候入队的)后,再进行出队,一旦有个消息出队后那么消息线程0就可以入队了,当三个入队线程1,2,0都出队后,由于还继续在执行出队方法,那么线程就进入了阻塞状态,程序一直不会结束。
2、反射api
实体类Dog
public class Dog implements Animal,Serializable{ public String name; private int age; public Dog() { super(); name = "Wangcai"; age = 18; } private Dog(Integer age) { super(); this.age = age; } public Dog(String name) { super(); this.name = name; } public Dog(String name, Integer age) { super(); this.name = name; this.age = age; } @Override public void shout() { System.out.println(name+":旺旺"); } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } private int getPrice(Integer n){ return 999*n; }}
在同一包下的配置文件db.properties
jdbc.username=rootjdbc.password=123456
测试反射的一些api
public class MyReflect { public Class dogClass; public String dogName = "com.scu.reflect.Dog"; /** * 获得与类名对应的Class类型对象 * @throws Exception */ @Before public void init() throws Exception{ dogClass = Class.forName(dogName); } @Test public void test1(){ System.out.println(dogClass); } /** * 获得Class类型对象的直接方式,结果同test1 */ @Test public void test2(){ System.out.println(Dog.class); } /** * 获得Class类型对象的实例,要求必须有构造方法 * @throws Exception */ @Test public void test3() throws Exception{ Dog dog = (Dog)dogClass.newInstance(); System.out.println(dog); } /** * 获取非私有的构造函数 * @throws Exception */ @Test public void test4() throws Exception{ Constructor constructor = dogClass.getConstructor(String.class,Integer.class); //使用构造器创建实例 Dog dog = (Dog)constructor.newInstance("wangcai",18); System.out.println(dog); } /** * 获取私有的构造函数 * @throws Exception */ @Test public void test5() throws Exception{ Constructor constructor = dogClass.getDeclaredConstructor(Integer.class); //由于是私有的,需要停止权限检查 constructor.setAccessible(true); //使用构造器创建实例 Dog dog = (Dog)constructor.newInstance(18); System.out.println(dog); } /** * 获取非私有成员变量 * @throws Exception */ @Test public void test6() throws Exception{ Constructor constructor = dogClass.getConstructor(String.class,Integer.class); //使用构造器创建实例 Dog dog = (Dog)constructor.newInstance("wangcai",18); Field field = dogClass.getField("name"); //设置值 field.set(dog,"xiaohu"); //获取name属性值 System.out.println(field.get(dog)); } /** * 获取私有成员变量 */ @Test public void test7() throws Exception{ Constructor constructor = dogClass.getConstructor(String.class,Integer.class); //使用构造器创建实例 Dog dog = (Dog)constructor.newInstance("wangcai",18); Field field = dogClass.getDeclaredField("age"); //同样需要停止权限检查 field.setAccessible(true); //设置变量值 field.set(dog, 9); //获取变量值 System.out.println("年龄:"+field.get(dog)); } /** * 获取所有非私有的函数 */ @Test public void test8() throws Exception{ //获取非私有的成员函数 Method[] methods = dogClass.getMethods(); for (Method method : methods) { System.out.println(method); } } /** * 获取指定的非私有的函数 */ @Test public void test9() throws Exception{ Object object = dogClass.newInstance(); Method method = dogClass.getMethod("shout"); //调用invoke对象的shout方法 method.invoke(object); } /** * 获取私有函数 */ @Test public void test10() throws Exception{ Object object = dogClass.newInstance(); @SuppressWarnings("unchecked") Method method = dogClass.getDeclaredMethod("getPrice",Integer.class); //停止权限检查 method.setAccessible(true); //返回999*3 Object ob = method.invoke(object,3); System.out.println(ob); } @Test public void test11() throws Exception{ //获得当前加载class文件的类加载器 System.out.println("类加载器:"+dogClass.getClassLoader()); //获得某个实现类的接口 Class[] interfaces = dogClass.getInterfaces(); System.out.println("父接口:"); for (Class clazz : interfaces) { System.out.println(clazz); } //获得父类 Class superclass = (Class)dogClass.getGenericSuperclass(); System.out.println("Dog父类:"+superclass); /** * getResourceAsStream这个方法可以获取到一个输入流,这个输入流会关联到name所表示的那个文件上。 */ //path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。 //其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 InputStream inputStream = dogClass.getResourceAsStream("db.properties"); System.out.println(inputStream); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println("读取连接信息"); String line = null; while(true){ line = reader.readLine(); if(line!=null){ System.out.println(line); }else { break; } } reader.close(); //判断当前Class类型对象是否为枚举类型,接口类型等 System.out.println("是否为枚举类:"+dogClass.isEnum()); System.out.println("是否为接口:"+dogClass.isInterface()); }}
阅读全文
0 0
- 并发包消息队列BlockingQueue与反射api
- java并发之消息队列BlockingQueue
- Java并发包:阻塞队列(BlockingQueue)
- Java并发包:阻塞队列(BlockingQueue)
- Java并发包:阻塞队列(BlockingQueue)
- java并发包消息队列及在开源软件中的应用-BlockingQueue
- java并发包消息队列
- Java并发包之BlockingQueue
- (java多线程与并发)java并发库中的阻塞队列--BlockingQueue
- Windows下一个并发阻塞队列(BlockingQueue)
- Windows下一个并发阻塞队列(BlockingQueue)
- JAVA并发之BlockingQueue阻塞队列
- Java多线程/并发26、阻塞队列BlockingQueue
- Java并发阻塞队列BlockingQueue概览
- Java并发编程:阻塞队列BlockingQueue
- 并发工具包—阻塞队列BlockingQueue
- 采用BlockingQueue实现内存消息队列
- Java多线程与并发库高级应用之阻塞队列BlockingQueue
- 从零开始前端学习[25]:万一你没有UI美工的时候,就要选择阿里矢量图了
- 巩固练习题1
- 策略模式与状态模式这一对孪生兄弟
- AlarmManager延时任务不生效
- request
- 并发包消息队列BlockingQueue与反射api
- 第四周项目3
- leetcode Symmetric Tree
- 算法练习(9):Longest Common Prefix
- luogu1516 POJ1061 青蛙的约会
- Xilinx ZYNQ 7000+Vivado2015.2系列(三)之HelloWorld实验(最小系统)(纯PS)
- 前端入门理解
- 中国行政区划的英文介绍
- clean code读书笔记一