}
}
}
{ }
bShouldSub = false; this.notify();
System.out.println(Thread.currentThread().getName() +
\
备注:不可能一上来就写出上面的完整代码,最初写出来的代码如下,问题在于两个线程的代码要参照同一个变量,即这两个线程的代码要共享数据,所以,把这两个线程的执行代码搬到同一个类中去:
package com.huawei.interview.lym;
public class ThreadTest {
new Thread(
new Runnable() {
public void run() {
private static boolean bShouldMain = false;
public static void main(String[] args) {
// TODO Auto-generated method stub /*new Thread(){ public void run() { }
//final String str = new String(\
for(int i=0;i<50;i++) {
for(int j=0;j<10;j++) { }
System.out.println(\
}
}.start();*/
}
}
for(int i=0;i<50;i++) {
synchronized (ThreadTest.class) {
if(bShouldMain) { }
for(int j=0;j<10;j++) { }
bShouldMain = true;
ThreadTest.class.notify();
System.out.println(
\
try { }
ThreadTest.class.wait();} e.printStackTrace();
catch (InterruptedException e) {
Thread.currentThread().getName() +
}
}
).start();
for(int i=0;i<50;i++) {
synchronized (ThreadTest.class) {
}
\
if(!bShouldMain) {
try { }
ThreadTest.class.wait();} e.printStackTrace();
catch (InterruptedException e) {
} {
for(int j=0;j<5;j++)
System.out.println(
Thread.currentThread().getName() +
}
}
}
bShouldMain = false;
ThreadTest.class.notify();
}
下面使用jdk5中的并发库来实现的: import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition;
public class ThreadTest { private static Lock lock = new ReentrantLock(); private static Condition subThreadCondition = lock.newCondition(); private static boolean bBhouldSubThread = false; public static void main(String [] args) { ExecutorService threadPool = Executors.newFixedThreadPool(3); threadPool.execute(new Runnable(){ public void run() { for(int i=0;i<50;i++) { lock.lock(); try { if(!bBhouldSubThread) subThreadCondition.await(); for(int j=0;j<10;j++) { System.out.println(Thread.currentThread().getName() + \j); } bBhouldSubThread = false; subThreadCondition.signal(); }catch(Exception e) { } finally {
}
}
lock.unlock(); } } } });
threadPool.shutdown(); for(int i=0;i<50;i++) { lock.lock(); try { if(bBhouldSubThread) subThreadCondition.await(); }
for(int j=0;j<10;j++) { System.out.println(Thread.currentThread().getName() + \ } bBhouldSubThread = true; subThreadCondition.signal(); }catch(Exception e) { }
finally { lock.unlock(); }
57、介绍Collection框架的结构
答:随意发挥题,天南海北谁便谈,只要让别觉得你知识渊博,理解透彻即可。
58、Collection框架中实现比较要实现什么接口
comparable/comparator
59、ArrayList和Vector的区别
答:
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。
接着才说ArrayList与Vector的区别,这主要包括两个方面:. (1)同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。 (2)数据增长: ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。
60、HashMap和Hashtable的区别
(条理上还需要整理,也是先说相同点,再说不同点) HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
Java面试宝典2012版



