- 浏览: 87082 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
qintengfei:
不错,问题解决了。
ResultSet转换为List的方法 -
weichen:
看完之后挺管用,拿来试试人人网,大部分应用都能进,但是游戏中的 ...
HttpClient -
nggno1:
学习了~
Date类学习总结 -
chen88358323:
httpclient.getConnectionManager ...
HttpClient关于下载的资料收集 -
Eric_2007:
最后一条,有点过份!
一个女生看了会哭,男生会沉默的故事
一、反射
1、获取方法和属性
反射可以获取这个类中定义的方法和属性的信息,简单数据类型在使用反射时要转换成封装类。
Class c = Teacher.class;
Method m = c.getMethod("mrthod",int.class);
2、通过类对象生成类的对象
Class c = Teacher.class;
Object o = c.newInstance();
3、通过类对象调用方法
//1.get class Object
Class c=Class.forName("Student");
//2.get Constructor object
Class[] cs={String.class};
Constructor con=c.getConstructor(cs);//按照参数表来调用制定构造方法。
//3.create object
Object[] os={"liucy"};
Object o=con.newInstance(os);
//4.get method object
String methodName="study";
Class[] pcs={String.class};
Method m=c.getMethod(methodName,pcs);//按照参数表来获得制定的方法对象。
//5.invoke the method
Object[] ocs={"EJB"};
m.invoke(o,ocs);
二、CoreJava 5.0的注释
1、定义:Annotation描述代码的代码(区:描述代码的文字)
给机器看 给人看的
2、注释的分类:
(1)、标记注释:没有任何属性的注释。@注释名
(2)、单值注释:只有一个属性的注释。@注释名(value=___)
在单值注释中如果只有一个属性且属性名就是value,则“value=”可以省略。
(3)、多值注释:有多个属性的注释。多值注释又叫普通注释。
@注释名(多个属性附值,中间用逗号隔开)
3、内置注释:
(1)、Override(只能用来注释方法)
表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
(2)、Deprecated
用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。
(3)、SuppressWarnings(该注释无效)
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
4、自定义注释
自定义注释
public @interface Test{
}
在自定义注释时,要用注释来注释(描述)注释。
@target(),用来描述(注释)注释所能够注释的程序员元素。
@Retention(),描述(注释)注释要保留多久。
注释的属性类型可以是
8种基本类型
String
Enum
Annotation
以及它们的数组
5、注释的注释:java.lang. annotation包中
(1)、Target:指示注释类型所适用的程序元素的种类。
例:@Target(value = {ElementType.METHOD});
说明该注释用来修饰方法。
(2)、Retention:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
例:Retention(value = {RetentionPolicy.xxx}
当x为CLASS表示保留到类文件中,运行时抛弃。
当x为RUNTIME表示运行时仍保留
当x为SOURCE时表示编译后丢弃。
(3)、Documented:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。
(4)、Inherited:指示注释类型被自动继承。如果在注释类型声
明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。
注:在注释中,一个属性既是属性又是方法。
■ 标注:描述代码的文字
描述代码的代码。给编译器看的代码,作用是规范编译器的语法。
class Student{
@Override
public String toString(){
return “student”;
}
}
■ 注释类型 java.lang
1、标记注释(没有属性)
@Override
2、单值注释
@注释名(a="liucy")
@注释名(prameter=10)
int parameter
特例:
@注释名 (value=“134” )
等价于 @注释名 (“134” )
3.普通注释(多值注释)
(key1=value,……)
@__(a="liucy,b=10)
■ @Override 只能放在方法前面
@Deprecated 用于描述过期
@SuppressWarnings 抑制警告
@SuperessWarning({“ddd”,”aaa”,”ccc”}) //JVM还没有实现这个注释
三、Java5.0中的并发
1、所在的包:Java.util.concurrent
2、重写线程的原因:
(1)何一个进程的创建(连接)和销毁(释放资源)的过程都 是一个不可忽视的开销。
(2)run方法的缺陷:没有返回值,没有抛例外。
3、对比1.4和5.0的线程
5.0 1.4
ExecutorService 取代 Thread
Callable Future 取代 Runnable
Lock 取代 Synchronized
SignalAll 取代 notifyAll()
await() 取代 wait()
三个新加的多线程包
Java 5.0里新加入了三个多线程包:java.util.concurrent, java.util.concurrent.atomic,
java.util.concurrent.locks.
java.util.concurrent包含了常用的多线程工具,是新的多线程工具的主体。
java.util.concurrent.atomic包含了不用加锁情况下就能改变值的原子变量,比如说AtomicInteger提供了addAndGet()方法。Add和Get是两个不同的操作,为了保证别的线程不干扰,以往的做法是先锁定共享的变量,然后在锁定的范围内进行两步操作。但用AtomicInteger.addAndGet()就不用担心锁定的事了,其内部实现保证了这两步操作是在原子量级发生的,不会被别的线程干扰。
java.util.concurrent.locks包包含锁定的工具。
Callable 和 Future接口
Executor接口替代了Thread类,他可以创建定量的和动态以及周期性的线程池。
ExecutorService接口,线程池,用来存放线程来节省创建和销毁资源的消耗。
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同:
Callable规定的方法是call(),而Runnable规定的方法是run().
Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
call()方法可抛出异常,而run()方法是不能抛出异常的。
Future对象可以获得线程运行的返回值
运行Callable任务可拿到一个Future对象,通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
以下是Callable的一个例子:
public class DoCallStuff implements Callable{ // *1
private int aInt;
public DoCallStuff(int aInt) {
this.aInt = aInt;
}
public String call() throws Exception { //*2
boolean resultOk = false;
if(aInt == 0){
resultOk = true;
} else if(aInt == 1){
while(true){ //infinite loop
System.out.println("looping....");
Thread.sleep(3000);
}
} else {
throw new Exception("Callable terminated with Exception!"); //*3
}
if(resultOk){
return "Task done.";
} else {
return "Task failed";
}
}
}
*1: 名为DoCallStuff类实现了Callable,String将是call方法的返回值类型。例子中用了String,但可以是任何Java类。
*2: call方法的返回值类型为String,这是和类的定义相对应的。并且可以抛出异常。
*3: call方法可以抛出异常,如加重的斜体字所示。
以下是调用DoCallStuff的主程序。
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Executor {
public static void main(String[] args){
//*1
DoCallStuff call1 = new DoCallStuff(0);
DoCallStuff call2 = new DoCallStuff(1);
DoCallStuff call3 = new DoCallStuff(2);
//*2
ExecutorService es = Executors.newFixedThreadPool(3);
//*3
Future future1 = es.submit(call1);
Future future2 = es.submit(call2);
Future future3 = es.submit(call3);
try {
//*4
System.out.println(future1.get());
//*5
Thread.sleep(3000);
System.out.println("Thread 2 terminated? :" + future2.cancel(true));
//*6
System.out.println(future3.get());
} catch (ExecutionException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
*1: 定义了几个任务
*2: 初始了任务执行工具。任务的执行框架将会在后面解释。
*3: 执行任务,任务启动时返回了一个Future对象,如果想得到任务执行的结果或者是异常可对这个Future对象进行操作。Future所含的值必须跟Callable所含的值对映,比如说例子中Future对印Callable
*4: 任务1正常执行完毕,future1.get()会返回线程的值
*5: 任务2在进行一个死循环,调用future2.cancel(true)来中止此线程。传入的参数标明是否可打断线程,true表明可以打断。
*6: 任务3抛出异常,调用future3.get()时会引起异常的抛出。
运行Executor会有以下运行结果:
looping....
Task done. //*1
looping....
looping....//*2
looping....
looping....
looping....
looping....
Thread 2 terminated? :true //*3
//*4
java.util.concurrent.ExecutionException: java.lang.Exception: Callable terminated with Exception!
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)
at java.util.concurrent.FutureTask.get(FutureTask.java:80)
at concurrent.Executor.main(Executor.java:43)
…….
*1: 任务1正常结束
*2: 任务2是个死循环,这是它的打印结果
*3: 指示任务2被取消
*4: 在执行future3.get()时得到任务3抛出的异常
lock接口
实现类ReentrantLock
我们可以用lock对象,来对临界资源加锁,只有获得lock对象才能访问临界资源,如果没有获得lock对象,就会进入lock对象的锁池。trylock()方法会返回布尔值,这个方法是用来判断这个锁对象是不是已经被线程获取,如果返回值为true,则会直接获得这个锁对象,如果返回false,线程不会阻塞还会继续运行。
Lock lock=new ReentrantLock();
publci void test(){
try{
lock.lock();//加锁
.....//需要加锁的临界资源。
}finally{
lock.unlock();//解锁。
}
}
ReadWriteLock读写锁接口
ReentrantReadWriteLock是ReadWriteLock的实现类。
readLock()分配读锁,读锁可以分配多个线程,但是在分配读锁后所有读锁释放前,写锁时不能分配的。
Lock writeLock() 写锁只能分配给一个线程,在分配写锁后写锁是放前,读锁不能被分配。
Condition接口和实现类
await()替代了wait()方法。
notify(),notifyAll() 在JDK5.0中已经用signal() ,signalAll()方法替换掉了,在JDK5.0中,可以使用多个等待队来存放等待的线程,并对线程进行分类。
Queue接口(Collection的子接口,对列接口)
LinkedList也实现了这个在JDK5.0中的新接口Queue,并且这个类自动的实现了生产者和消费者的同步。
JDK5.0的高级同步
Semaphore类(信号量)也就是可以向线程分配许可证,指定许可证数量可以实现多线程的同步。
Semaphore s=new Semaphore(4);//可以分配4个许可证,许可证都被分配出去时,得不到许可证的线程就会阻塞。
acquire()方法,获得许可证。release() 方法,释放一个许可证,也有相应的方法指定释放和获得许可证的数量的方法。
CountDownLatch类,
CountDownLatch中有个计数器,访问这个类的对象就会从计数器中减一,countDown()方法会将原有的设置的计数器值减一,当countdown计数器为零时会使放所有await()的线程。
CyclicBarrier类
CyclicBarrier和CountDownLatch比较相似
CyclicBarrier在构造时给出线程数,只有等待的线程数到了构造方法中指定的数量,当最后一个线程等待后,所有的线程都会被释放,这个类是一个多线程汇合的工具。
Exchanger类,用exchange()方法可以使两个线程间相互交换对象,在两线程的同步点,等待第二个线程。在同步点时,交换对象,并同时被释放。
发表评论
-
java复习第十七天
2008-12-11 13:43 1159一、Java5.0新特性 ... -
java复习第十六天
2008-12-11 13:43 868网络基础知识 网络编程的目的就是指直接或间接地通过网络协议 ... -
java复习第十五天
2008-12-11 13:42 1105一、 (一) DataInputStrea ... -
java复习第十四天
2008-12-11 13:40 952一、 多线程的通信 ■ 因为线程的死锁,从而引发要多线程的 ... -
java复习第十三天
2008-12-11 13:38 822一、 ■ 阻塞状态 ... -
java复习第十二天
2008-12-11 13:37 1088一、复习AWT事件模型(Observer模式) 1、事件 ... -
java复习第十一天
2008-12-11 13:36 803一、复习 集合:用一个对象储存管理多个对象 Collecti ... -
java复习第十天
2008-12-11 13:35 1082一、复习内部类 1、成员内部类 可以访问外部类的私有 ... -
java复习第九天
2008-12-11 13:34 847一、复习 1、Object 所有 ... -
java复习第八天
2008-12-11 13:33 911一、复习 接口 是个特殊的抽象类,属性:公开静态常量,方法:公 ... -
java复习第七天
2008-12-11 13:33 1087一、复习 static 属性 类变量 全类共有 类加载时 ... -
java复习第六天
2008-12-11 13:32 896修饰符 一、static 修 ... -
java复习第五天
2008-12-11 13:30 955一、复习 1、封装 该 ... -
java复习第四天
2008-12-11 13:14 10431、复习 面向对象思 ... -
java复习第三天
2008-12-11 12:35 10521、面向对象的思想 ... -
java复习第二天
2008-12-11 10:31 1016... -
java复习第一天
2008-12-11 10:12 16881、Jav ...
相关推荐
【Java 考试复习指南】 1. Java 编译过程:Java 源程序文件(扩展名为 .java)经过Java编译器编译后,会生成字节码文件(扩展名为 .class)。这是Java程序运行的基础,因为JVM(Java虚拟机)执行的是字节码。 2. ...
《Java语言程序设计第10版(基础篇)》是一本深入浅出的Java编程教材,旨在帮助初学者掌握这门强大的面向对象编程语言。复习题答案提供了对每一章节核心概念的检验和巩固,帮助读者确认对每个主题的理解是否到位。...
Java语言是在1995年由Sun Microsystems公司第一次正式发布的,James Gosling被誉为Java之父。 #### 八进制整数表示 4. **答案**:选项D。`0144`表示八进制整数,其十进制等值为100。 #### 编译错误 5. **答案**:...
Java 语言程序设计基础课后复习题答案第十三章 本部分内容将详细讲解 Java 语言程序设计基础课后复习题答案第十三章中的知识点。 一、Java 基础知识 1.1 在 Java 中,什么是可变长参数?答:在 Java 中,使用可变...
【Java复习题库知识点详解】 Java是一种面向对象的高级编程语言,它的主要特点包括:面向对象、跨平台、高性能和丰富的类库。在Java中,程序的基本单位是类,而不是文件,因此选项B描述错误。Java语言区分大小写,...
JAVA理论知识基础复习 JAVA理论知识基础复习是指对JAVA语言的基础知识进行复习和总结,本文将涵盖构造方法、new关键字、方法的重载、特殊变量this、static定义常量、继承、方法的重写、特殊变量super、多态性等相关...
13. **Java复习第十三天**:最后可能会讲解一些高级话题,如集合框架的高级特性和并发库(如ConcurrentHashMap、ExecutorService)的使用,或者JVM内存模型和垃圾回收机制。 通过这些复习笔记,读者可以逐步建立起...
### Java基础复习知识点详解 #### 一、Java语言特点 - **高级编程语言**:Java是一种面向对象的高级编程语言,具有以下特点: - **简单性**:语法简洁,易于学习。 - **结构中立**:独立于硬件结构,能够在各种...
根据提供的文件信息,我们可以整理出以下关键的Java知识点: ### 1. 访问修饰符 public, private, protected, default - **public**: 公有访问级别,可以在任何地方被访问。 - **protected**: 受保护访问级别,...
"北师珠信院Java期末考试复习题.zip"这个压缩包包含了从ch01到ch18的章节练习,覆盖了Java语言的各个方面,旨在帮助学生巩固基础,提升应试能力。 首先,让我们逐一探讨这些章节可能涵盖的关键知识点: 1. **...
总的来说,Java复习应该注重理论知识与实践相结合,通过编写和理解代码来加深对语言特性的掌握。同时,了解并遵循Java编程规范,能够提高代码的可读性和可维护性。最后,对于考试,应熟悉考试格式和要求,合理安排...
第十一部分:Java 语言的内存管理 1. Java 语言的内存管理是指 JVM 中的垃圾回收机制。 2. 内存管理可以避免内存泄露和溢出。 第十二部分:Java 语言的跨平台 1. Java 语言的跨平台是指 Java 语言可以在不同的...
### JAVA选择题复习知识点 #### 1. Java语言的特点与起源 - **Java语言的特点**: - Java是一种面向对象的编程语言。 - 它的设计目标是具有跨平台的能力,即“一次编写,到处运行”(Write Once, Run Anywhere, ...
Java是一种广泛使用的高级编程...第十八题、第十九题和第二十题的答案分别是A、B和B。 最后,Java程序的运行环境次序是Java程序、JRE(Java运行时环境)/JVM(Java虚拟机)、操作系统、硬件,所以第二十一题答案是C。
这些题目覆盖了Java的基础语法、类和对象、数据类型、运算符、控制流、Applet、数组以及字符串操作等多个核心知识点,是学习和复习Java语言的重要资料。通过解决这些问题,开发者可以巩固对Java编程基础的理解,并...
12. 插入到第1行:在Java源代码中,第1行通常是包声明,所以A选项正确。 13. 修饰符混用:`abstract`不能与`final`一起修饰同一个类,因为`final`表示不可改变,而`abstract`表示抽象的,两者矛盾,A选项正确。 14...