- 浏览: 342898 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zy_mensheng:
请问一下 怎么 js没有解析啊 还是钟表图..
调用BIEE提供的web service -
安铁辉:
师兄你很久没更新博客了
Information Dashboard Design读书笔记 -
mojunbin:
很清晰的文章
秒杀相关知识以及技术 -
yanchangjun8102:
楼主你好,我也最近在研究biee的webservice这块,按 ...
调用BIEE提供的web service -
sacredon:
不错,楼主我是看着你的这篇文章写代码调用的BIEE的Web ...
调用BIEE提供的web service
并发:
冒泡排序:
SimpleThreadExceptionHandler.java:
package testthread; public class SimpleThreadExceptionaHandler implements Thread.UncaughtExceptionHandler{ public void uncaughtException(Thread t, Throwable e) { System.out.println("into this method"); System.err.printf("%s : %s at line %d of %s\n", t.getName(), e.toString(), e.getStackTrace()[0].getLineNumber(), e.getStackTrace()[0].getFileName() ); } } BubbleSortThread.java package testthread; public class BubbleSortThread extends Thread { private int[] numbers; public BubbleSortThread(int[] numbers) { this.setName("BubbleSortThread"); setDefaultUncaughtExceptionHandler(new SimpleThreadExceptionaHandler()); this.numbers = numbers; } //冒泡排序,两层循环 @Override public void run() { int index = numbers.length; boolean finished = false; while (!finished) { finished = true; index--; for (int i = 0; i < index; i++) { if (numbers[i] < 0) { throw new IllegalArgumentException("can't pass into a negative number"); } //swap int temp = 0; if(numbers[i]>numbers[i+1]){ temp = numbers[i+1]; numbers[i+1]=numbers[i]; numbers[i]=temp; finished = false; } } } } public int[] getNumbers(){ return this.numbers; } }
测试类:
package testthread; import java.util.logging.Level; import java.util.logging.Logger; public class Main { public static void main(String[] args) { int[] posNumbers = new int[]{5, 4, 3, 2, 1}; int[] negNumbers = new int[]{-3, -1, -5, -2, -7}; BubbleSortThread b1 = new BubbleSortThread(posNumbers); BubbleSortThread b2 = new BubbleSortThread(negNumbers); try { b1.start(); b1.join(); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } for(int i:b1.getNumbers()){ System.out.println(i); } try { b2.start(); b2.join(); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } for(int i:b2.getNumbers()){ System.out.println(i); } } }
运行后打印信息如下:
1
2
3
4
5
into this method
BubbleSortThread : java.lang.IllegalArgumentException: can't pass into a negative number at line 28 of BubbleSortThread.java
-3
-1
-5
-2
-7
成功生成(总时间:0 秒)
setDefaultUncaughtExceptionHandler的作用:
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
上例中,当数组元素小于0时,抛出了IllegalArgumentException异常,由于线程没有设置异常处理程序,则有默认的异常处理程序捕获该异常来处理。
该方法为Thread的静态方法,设置对其他Thread对象同样有效。即其他thread发生异常但未设置异常处理程序,也会交给这个默认处理器进行异常处理。
如果一个Thread有自己的处理程序,它当然会override掉此默认的处理程序。事实上,下面是JVM在判别要如何处理一个未捕获异常时所执行的检查顺序:
1,
检查是否有此thread自有的处理程序可以调用,如果有的话,就调用它。
充:Thread的setUncaughtExceptionHandler方法:
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置该线程由于未捕获到异常而突然终止时调用的处理程序。
通过明确设置未捕获到的异常处理程序,线程可以完全控制它对未捕获到的异常作出响应的方式。如果没有设置这样的处理程序,则该线程的 ThreadGroup 对象将充当其处理程序。
2,
如果所属的ThreadGroup(以及它的先祖)并没有override过uncaughtException(),则对ThreadGroup层向上传递此异常,一直到遇到ThreadGroup的root为止。
充:
线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。
继承体系结构为:
java.lang
类 ThreadGroup
java.lang.Object
----java.lang.ThreadGroup
所有已实现的接口:
Thread.UncaughtExceptionHandler
类ThreadGroup的方法
uncaughtException(Thread t, Throwable e)
当此线程组中的线程因为一个未捕获的异常而停止,并且线程没有安装特定 Thread.UncaughtExceptionHandler 时,由 Java Virtual Machine 调用此方法。
3,
调用Thread.getDefaultExceptionHandler()中取得的默认处理程序。
ConcurrentHashMap
该类不同步化所有的读取method。如此就立竿见影地处理掉许多锁定与threading的问题。更重要的是,ConcurrentHashMap将它内部的hashtable区段间隔开来,所以你可以在其他的thread写入到一个区段时写入到另外一个区段(除了读取是一直都被允许的)。
CopyOnWriteArrayList
该类是个thread-aware版的List,(当然)更是针对ArrayList的。这是对不常被更新但常被读取的array的最好的解决方案。它解除掉同步化,能够允许任意数目的并发读取。对于写入,它实际上创建了一个所属array的新拷贝,然后再将此新的拷贝(以及异动)分配回所属的原版的那一份。查看源代码如下:
//该方法没有进行同步控制 final Object[] getArray() { return array; } //增加元素的方法,使用了锁机制。将数组拷贝的同时,允许其他线程并发读取数组(有可能读取的数组不一样,但问题不大,可以提高读取的并发性,在设置新的数组前读取的则是旧数组,在设置后读取的是新数组)。 public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }
打印随机数:
package testexecutor; import java.math.BigInteger; import java.security.SecureRandom; import java.util.Random; import java.util.concurrent.Callable; public class RandomPrimeSearch implements Callable{ private int bitSize; private static final Random rng = new SecureRandom(); public RandomPrimeSearch(int bitSize){ this.bitSize = bitSize; } public BigInteger call() throws Exception { return BigInteger.probablePrime(bitSize, rng); } }
测试类:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package testexecutor; import java.math.BigInteger; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; public class Main { public static void main(String[] args) { ExecutorService exe = Executors.newCachedThreadPool(); Future<BigInteger> f1 = exe.submit(new RandomPrimeSearch(4)); Future<BigInteger> f2 = exe.submit(new RandomPrimeSearch(3)); exe.shutdown();//如果不加这一句,程序不会停止 try { System.out.println(f1.get()); System.out.print(f2.get()); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (ExecutionException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } }
打印输出:
7
BigInteger的构造函数BigInteger(int numBits,Random rnd),构造一个随机生成的 BigInteger,它是在 0 到 (2的numBits次幂 - 1)(包括)范围内均匀分布的值。
无ExecutorService地执行任务
当你有一个小小的Callable对象要执行,而你又不想要ExecutorService的代价是要怎么办?可以使用FutureTask类。
java.util.concurrent.FutureTask可以被Callable对象给包起来,让他们可如同从ExecutorService.submit()所返回的Future实现般的运作。示例程序:
FutureTask<BigInteger> f = new FutureTask<BigInteger>(new RandomPrimeSearch(3)); new Thread(f).start(); BigInteger reuslt = f.get();
查看FutureTask的javaDoc发现该类还有一个构造函数:
public FutureTask(Runnable runnable,V result)
创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。
由于Runnable的run方法没有返回结果,所以在构造函数中提供参数化所指定的类型的值,它会在执行成功时有get()返回。
示例程序:
FutureTask<Object> f = new FutureTask<Object>(new MyRunnableObject(),new Integer(23));
new Thread(f).start();
System.out.println(f.get());//打印输出23
如果不需要特定的结果,则考虑使用下列形式的构造:Future<?> f = new FutureTask<Object>(runnable, null);
高等Synchronizing
Semaphore
acquire()有数种变化,可以在遇到block的时候能够对接下来要怎么做有些控制权。这包括了tryAcquire(),它要么就是没有被block住,不然就是等待指定的timeout;还有acquireUninterruptibly(),就算是遇到InterruptionException也不会罢手。
CountdownLatch
当latch的计数器减到0时,latch就会打开,而等在await()那里的thread变成没有被block并继续运行。
Exchanger
Exchanger提供了两个thread的会合点,通常用在“消费者-制造者”关系中。在某一点上这些thread必须“会合”,以交换它们个别任务的结果。
最常见的Exchanger运用方式是当生产者将数据填入缓冲区时,消费者从其他的来源将资料消耗掉。一旦生产者填满它的缓冲区,且消费者也把它自己的缓冲区消耗掉,两者就可以交换缓冲区并继续运作。然而,两方都必须在交换前完成自己的工作。Exchanger.exchange()如你所预期的就是在做这样的工作。
CyclicBarrier
一旦所有的thread都调用了await(),blocking都会被停掉,所以全部的thread就可以继续(通常是交互)。此外,barrier是全有或全无的:如果一个thread反常地失败,且提早离开barrier,则所有的thread都会反常地离开。
AtmicInteger
一个atomic类型就是有一个atomic operation可用的类型,他可以在基本上是没有block的情况下还是做到thread-safe。
AtomicInteger ai = new AtomicInteger(0); int result=0; do{ result = ai.get(); }while(!ai.compareAndSet(result, result+1));
ReentrantLock
它是与synchronized程序区块最接近的class,即使说它有多一点的Lock功能。同时也提供了ReadWriteLock,它用来维护读取与写入分离的lock。同时可以有多个thread持有read lock,因为read通常是安全的并发操作,但只有一个thread可以持有write lock。这个class的实现(像是ReetrantReadWriteLock)用在大量的数据上是最适合的,因为读取数据发生的机会比写入一小段数据的机会大多了。
Arrays的deepToString()方法可以打印多维数组
Arrays提供的deepEquals()这个method来比较多维的array
StringBuffer的有些方法使用了同步,在你不担心有多个线程并发访问时可以使用StringBuilder类,它提供了和StringBuffer同样的功能,但没有同步。
发表评论
-
【转】hashCode()的作用
2011-05-14 13:41 855http://blog.csdn.net/badboy_blu ... -
AOP
2011-02-24 19:47 1541AOP有三种织入切面的方法:其一是编译期织入,这要求使用特殊的 ... -
code hot swap
2010-08-04 22:54 1301关于code hot swap的说明(即更新部署目录的clas ... -
java基础复习(18)-对象序列化
2009-08-03 01:35 22012009年8月3日 星期一 00时03分对象序列化的深入探究 ... -
java基础复习(17)--字符串,集合,I/O
2009-07-30 22:48 1514读取properties 文件时出现乱码 如果 ... -
java基础复习(16)-字符串数组交集,并集和差集
2009-07-29 15:47 6823求两个字符串数组的交集,并集和差集的程序代码(有其他或更好的方 ... -
java基础复习(15)-多态问题强化
2009-07-27 13:34 1175多态题目: 题一: ... -
java基础复习(13)--java泛型
2009-07-26 19:53 1524泛型: public static <T> ... -
java基础复习(12)--类型转换,异常概念
2009-07-26 19:43 1563一个对象只能有一种确 ... -
java基础复习(11)--final关键字和抽象类
2009-07-26 19:40 1170final 关键字 final--用于类,方法,变量前 f ... -
java基础复习(10)--链表实现,单例模式
2009-07-26 19:37 1226类的构造器也可以实现 ... -
java基础复习(9)--继承与多态的理解
2009-07-26 19:34 1009继承与多态 ... -
java基础复习(8)--数组
2009-07-26 19:12 1523java中有包名的类无法引 ... -
java基础复习(7)--值传递和交换变量值(异或)
2009-07-26 19:10 2415对于java中的方法参数传 ... -
java基础复习(6)
2009-07-26 16:18 1029充:java中有包名的类无法引用默认包中的类。但是1.2或1. ... -
java基础复习(5)--考试习题
2009-07-26 16:00 1252今天做练习题,一共有3 ... -
java基础复习(4)
2009-07-26 15:55 998极限编程 测试先行 ... -
java基础复习(3)
2009-07-26 15:51 1001int型整数,a>>b,系 ... -
java基础复习(2)
2009-07-26 15:45 1157java中的TRUE和false不可以 ... -
java基础复习(1)
2009-07-26 15:43 1078java虚拟机对java字节码进行优化(针对特定的平台) j ...
相关推荐
这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,帮助求职者准备Java相关的面试。 1. **Java基础知识** - 类与对象:Java是一种面向对象的语言,了解类的定义、构造器、...
### Java基础复习知识点详解 #### 一、Java语言特点 - **高级编程语言**:Java是一种面向对象的高级编程语言,具有以下特点: - **简单性**:语法简洁,易于学习。 - **结构中立**:独立于硬件结构,能够在各种...
本篇文章将详细讲解Java和JavaSE的基础知识点,并结合提供的"Java JavaSE 必练基础案例",帮助你巩固和深化理解。 首先,Java是一种面向对象的编程语言,它的设计目标是“一次编写,到处运行”。这意味着,通过Java...
这份"Java基础考试复习资料"涵盖了初学者需要理解的重要概念,旨在帮助广大备考者有效地准备Java相关的考试。以下是一些关键知识点的详细说明: 1. **Java简介**:Java是由Sun Microsystems公司开发的一种跨平台、...
【Java基础与实践】是Java学习的重要组成部分,涵盖了语言的基础概念到实际应用的各个层面。这份压缩包"Java基础与实践-源代码.rar"显然包含了多个章节的学习资源,每个章节以"ch"开头的文件名代表不同的主题。下面...
这份"Java基础核心总结_副本"的资料,很可能是对Java语言基础知识的全面梳理,旨在帮助学习者或面试者巩固和复习Java的核心概念。下面将根据标题和描述,结合常见的Java基础知识,来展开详细讲解。 一、基础语法 ...
10. **Java并发编程**:包括线程池、锁机制(如synchronized、ReentrantLock)、并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)以及并发工具类(如CountDownLatch、CyclicBarrier)。 这些是Java基础知识...
这份“Java基础知识总结 - 超详细篇收藏”压缩包包含了关于Java编程的基础知识,是学习和复习Java语言的理想资源。以下是对其中可能涵盖的知识点的详细解释: 1. **Java环境搭建**:学习Java的第一步是安装JDK...
求职者需要了解如何避免死锁,掌握线程池的工作原理,以及Java并发编程的基本原则。 数据库方面,"数据库.pdf"可能涉及SQL优化、索引原理、事务处理、存储过程、数据库设计范式等主题。对于MySQL,可能还会探讨...
复习Java,首先需要理解其基本概念和技术要点。 一、Java基础知识 1. Java语言的特点: - 跨平台性:Java代码通过JVM(Java虚拟机)实现“一次编写,到处运行”。 - 面向对象:Java支持类、对象、封装、继承、...
1. `JAVA复习题201004.xls`:这可能是一个2010年4月的Java复习题目集合,可能包含了选择题、填空题、简答题等多种题型,用于帮助考生复习Java的基础知识和进阶概念,如类与对象、继承、多态、异常处理、集合框架、IO...
这份复习笔记将涵盖Java的基础知识,包括语法、数据类型、控制结构、类与对象、异常处理、输入/输出以及集合框架等核心概念。 1. **Java语法** Java的语法基于C++,但简化了一些复杂的特性。例如,Java没有指针,...
"Java基础复习"这个主题涵盖了从入门到进阶的各种概念,旨在帮助学习者巩固和深化对Java语言的理解。以下是一些关键的知识点: 1. **Java语言简介**:Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems...
这份“Java基础知识复习资料”涵盖了学习Java编程所必需的关键概念和技术,旨在帮助初学者巩固基础,同时也适合有经验的开发者进行回顾。 1. **Java语法基础** - **变量与数据类型**:Java提供了基本数据类型(如...
在准备面试时,除了简历,还要对Java相关知识进行深入复习,包括但不限于:多线程、并发编程、集合框架、设计模式、异常处理、IO流、网络编程等。同时,了解当前流行的Java框架和最佳实践,如Spring Boot、Docker、...
这份“JAVA基础复习资料”涵盖了初学者需要掌握的核心概念,也是经验丰富的开发者回顾基础的宝贵资源。下面,我们将深入探讨这10个章节的主要知识点。 1. **第一章:Java简介** Java的历史、设计哲学以及其在软件...
### Java秋招复习资料——操作系统基础 #### 一、操作系统基本特征 1. **并发**:并发是指在宏观上能够同时运行多个程序的能力。而并行则是指在同一时刻能够执行多个指令,通常需要硬件的支持,比如多核心处理器或...
在“硅谷java基础每日复习eDiary”这个资源中,我们涵盖了Java编程语言的基础和高级概念,这将有助于深入理解并提升Java编程技能。以下是基于描述中提到的两个文件——"Java基础每日复习笔记-JavaSE基础阶段.edf"和...
Java笔试题是求职者在应聘Java相关职位时经常会遇到的一种测试形式,主要考察候选人的编程基础、算法理解、数据结构掌握、并发编程、框架应用等多个方面的技能。这份名为"各个公司的java笔试题---book"的资源集合,...
这些知识点通常会出现在公司内部的JAVA基础复习题中,通过练习这些题目,开发者可以巩固理论知识,提升实际编程技能。每个xls文件可能包含了针对上述知识点的不同题目,通过解答,可以帮助你更好地准备公司的Java...