本帖最后由 郑正华 于 2012-8-1 18:48 编辑
1.为什么线程访问同一组数据会出问题?
因为线程是并发执行的,就跟赛跑似的,谁领先谁就先运行。举个例子,比如你的代码中有个变量 x = 1;每访问一次就x++;当一个线程A想要访问这一组数据时,本来这个线程想要得到x的最初值,也就是1,但是另外一个线程B抢先访问了这组数据,于是因为执行了x++;所以x变成2了,那线程A不就火大了么,没有访问到x的最初值,这就是线程的安全问题!
生活中的例子就是去食堂买饭,本来你正准备刷卡买下最后3根油条,有一哥们冲了过来,抢先把卡刷了,拿下那3根油条,那你不得揍他一顿!这不就出问题了!没有规矩不成方圆,所以要排队买饭,也就是后来的线程同步!
2.Runnable为什么比Thread创建进程要好?(可以用代码举例吗?)
因为实现Runnable接口可以避免java 单继承的局限性,举个例子,比如A类继承了B类,可是现在A类里有块代码想要用多线程执行,就是想要被共享,那因为java只支持单继承的模式,所以A类就不能再继承Thread类了,但是你如果实现Runnable接口。你不仅可以继续继承B类,还可以实现多线程了~
两种方式的其他区别:
继承Thread类:线程代码存放在Thread子类的run方法中。
实现Runnable接口:线程代码存放在接口的子类的run 方法中。
在这里强烈建议你看一下毕老师的java基础教程视频第11天07和08视频,售票的例子,创建线程-实现Runnable接口,看了之后你就一清二楚了!
3.能不能帮我解释一下 for的加强 是怎么回事,就是那个for(:)里面有冒号那个?
增强for循环内部是使用的Iterator来遍历的,只能遍历数组和实现了Iterable接口的集合。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标。
增强型的for循环 优点主要体现在集合中,随便举个例子,你看增强for循环的写法是不是简洁!
比如对 set 的遍历
一般的迭代遍历写法:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
------------------------------------
增强for循环遍历写法:
for (String str : set) {
System.out.println(str);
}
----------------------------------
4.switch的条件可以是 一个类或者对象 或者是 一个方法的返回值吗?
switch语句的判断条件可以接受int,byte,char,short,还有枚举,顺便提一下,JDK7.0的新特性,枚举开始支持字符串了!
|