阅读《Java多线程编程核心技术》线程间通信时遇到的一个问题,求解

青峰素装 2018-09-14 10:24:46
加精
阅读《Java多线程编程核心技术》线程间通信时遇到的一个问题,求解

package com.qf.test01;

import java.util.ArrayList;
import java.util.List;

/**
* @author qf
* @create 2018-09-13 17:47
*/
public class MyList {
private List list = new ArrayList();
public void add(){
list.add("qf");
}
public int size(){
//System.out.println("MyList.size:"+list.size());
return list.size();
}
}

}

=============================
package com.qf.test01;

/**
* @author qf
* @create 2018-09-13 17:45
*/
public class ThreadA extends Thread {
private MyList myList;

public ThreadA(MyList myList) {
this.myList = myList;
}

@Override
public void run() {
try {
System.out.println("a run");
for (int i = 0; i < 10; i++) {
myList.add();
System.out.println("添加了"+(i+1)+"个元素");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

=============================
package com.qf.test01;

/**
* @author qf
* @create 2018-09-13 17:45
*/
public class ThreadB extends Thread {
private MyList myList;

public ThreadB(MyList myList) {
this.myList = myList;
}

@Override
public void run() {
try {
System.out.println("b run");
while (true){
if(myList.size() == 5){
System.out.println("线程b要退出了");
throw new InterruptedException();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

=============================
package com.qf.test01;

/**
* @author qf
* @create 2018-09-14 9:23
*/
public class Test {
public static void main(String[] args) {
MyList list = new MyList();
ThreadA a = new ThreadA(list);
a.setName("a");
a.start();
ThreadB b = new ThreadB(list);
b.setName("b");
b.start();
}
}

---------------------------------------------------------------------------------------------------------
上面代码运行结果:
a run
添加了1个元素
b run
添加了2个元素
添加了3个元素
添加了4个元素
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素
-----------------------------------------------------------------------------------------------------------
想问下,为什么b线程中设置抛异常的语句没有执行?
...全文
4976 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
dkwuxiang 2019-11-26
  • 打赏
  • 举报
回复
主要是cpu,主存,与线程自己的工作内存空间 首先,每个线程会从主存中拷贝一份到自己的工作内存中,然后在线程中每次访问该变量时都是访问的线程工作内存(高速缓存)中的变量副本,而不是每次都去主存中读取。 现在的问题是,那么什么时候线程会重新去主存中读取共享变量的值以及什么时候会将工作内存刷写会主存呢? 1、线程中释放锁时 (如:synchronized ) 2、线程切换时 (如:System.out.println) 3、CPU有空闲时间时(比如线程休眠时) 4、volatile 修饰变量
jiawenhe123 2019-11-26
  • 打赏
  • 举报
回复
你的list被两个线程共享使用,这就涉及到list的原子性,一致性和可见性问题。 语句
 if(myList.size() == 5)
{
                    System.out.println("线程b要退出了");
                    throw new InterruptedException();
}
是一个状态发现的过程,这个语句的执行线程必须有机会执行判断,而这个判断取决于CPU的调度,很不可靠, (其实Java.util.ConcurentHashMap的算法就有这个问题,文档中明确进行了说明,这个场景可用于弱一致的判断)。 要正确实现if(myList.size()==5),这个需要保证在执行语句线程调用的时候,其他共享数据线程不会write数据,否则结果不可预知。 如果只有两个线程,即读写线程,那么可以使用wait/notify(All),或者一些高级锁实现。 要解决这样的问题,就要引入支持并发的队列做缓冲区或者使用SynchronsQueue实现。
DazedMen 2019-11-26
  • 打赏
  • 举报
回复
他说的已经很好了,可能的造成这种问题的原因都说了下, 1.cpu执行权的问题,list数量等于5时,线程B可能并没有cpu执行权 2.线程变量副本,每个线程都回copy一份变量副本,B线程可能读的是变量副本 但是我不赞同线程A还在运行,线程B已经运行结束的说法。原因是线程A,线程B都在主线程中运行,从打印结果来说,线程A运行完成,线程B由于主线程结束,打印日志面板看不到输出信息,但线程B并没有结束
引用 14 楼 zoujiawei6 的回复:
刚开始也想到了volatile或者同步synchronized,也确实能够解决。但如果不去弄懂原理,就不符合我逛论坛的初衷。 我模糊地想起了很早以前读过的文章,但是遗忘相当严重。于是又回头翻箱倒柜地把它们找了出来,又读了一遍。鼓掌。 一、多线程是如何执行的之《我是一个线程》 二、多线程的高速缓存之《Java并发编程:volatile关键字解析》 根据以上两篇文章,我提出我的看法,不保证见解的准确性,也欢迎大牛指正: 首先,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。(原文:《Java并发编程:volatile关键字解析》) 其次,是Intel 的MESI协议。当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。(原文:《Java并发编程:volatile关键字解析》) 再者,每个线程只能在CPU上运行一段时间,到了时间就得让别人用了。(原文:《我是一个线程》) 假设有线程A、B,操作共享变量i,A线程进行i++操作,B线程只负责读取和判断。 A线程执行i++操作时,进行了以下步骤: 1、取得CPU的执行权 2、从主存中读出数据进行缓存作为高速缓存 3、使用高速缓存 4、执行i++ 5、通过MESI机制,通知其他CPU将该变量的缓存行置为无效状态 6、重复步骤2 当B线程执行时: 1、取得CPU的执行权 2、从主存中读出数据进行缓存作为高速缓存 3、使用高速缓存 4、执行判断逻辑 5、重复步骤3 在B重复步骤3时,发现缓存为无效状态,从主存中再次读取。 那么在B线程执行第3、4、5步的时候,A线程已经进行了3次计算并写入主缓存,此时B再去拿的时候i=3。 这里只是举个例子,B线程再读的时候,i可能为7或8、9,这取决于线程的执行时间;也有可能,b去读的时候恰好是5. 因此,这个问题不用加锁,不用加volatile就能解决:进行i>5判断

    if(size > 5){
        System.out.println("线程b要退出了");
        throw new InterruptedException();
    }
这种方式是最有效的。 如果只能进行 i==5判断,那么可以考虑保持读写的一致性:
class MyList {
    private int i=0;
    public synchronized void add(){
        i++;
    }
    public synchronized int size(){
        return i;
    }
}
也可以使用volatile放弃缓存,强制读取。
  • 打赏
  • 举报
回复
每次读的都是新的引用,而且多线程读取共享变量时,他只会读取最初的变量,不会实时去获取主存的实时数据;
瘦死的黑骆驼 2019-08-20
  • 打赏
  • 举报
回复
MyList list = new MyList(); ThreadB b = new ThreadB(list); b.setName("b"); b.start(); ThreadA a = new ThreadA(list); a.setName("a"); a.start(); 先运行b再运行a ,a线程启动执行太快,b可能还没运行,或者b运行的时候size已经大于5了,死循环
ITjavaman 2019-08-19
  • 打赏
  • 举报
回复
这个问题,我前阵子刚好研究了一下,我的结论是这样的 都知道java的变量实例都是放在jvm栈堆里面,这里不做具体深究,直接原因不在于此,这里的栈堆我们简单理解都是放在内存上, 电脑运行的时候,cpu会从内存里面读取数据 按照上面的例子,那么cpu会把从内存拿到的变量也就是mylist加载到cpu的高速缓存寄存器中,两个线程A,B在cpu里面都会从内存里面复制一遍mylist,当cpu运行完才会将把结果值赋值回内存 现在重新看一遍,A线程在cpu里面把元素添加完返回内存,这个时候B线程检测mylist的还是cpu里面的缓存,所以答案就出来了 扩展一:为什么加上volatile关键字就没有问题呢,那是因为带有这个关键字修饰的变量,cpu都不会加载访问自身寄存器的缓存,都是直接 范围内存上的值 扩展二:这个模式是由于jvm自身的一些优化(HotSpot目前主要是这个),可以试着把jit或者server模式关闭(相当于取消优化),再去运行也能达到你的效果 水平有限,欢迎探讨
qq_39936465 2019-08-19
  • 打赏
  • 举报
回复
引用 49 楼 xlct88 的回复:
你没看出来吗?你的两个集合不是同一个实例啊,MyList里面的代码第一行就代表着每次有个新的MyList就会有一个新的list对象出来,当然不会互相影响的
是不是同一个实例你要看主程序,明显2个进程添加的参数实例是同一个。
asafer 2019-08-19
  • 打赏
  • 举报
回复
楼主ThreadB为什么要判断size==5,线程A和线程B是两条相互独立的线程,而且计算机执行速度是非常快的,而你在A线程里面塞了10个元素,线程B里面刚好等于5的几率相当于你中500万的记录,你没有加同步处理,那么线程B必需捕捉到线程A写入5个元素的瞬间,这要的概率,你怕是找打
xlct88 2019-07-18
  • 打赏
  • 举报
回复
你没看出来吗?你的两个集合不是同一个实例啊,MyList里面的代码第一行就代表着每次有个新的MyList就会有一个新的list对象出来,当然不会互相影响的
maywin924 2019-07-18
  • 打赏
  • 举报
回复
Object[] objects = new Object[1000000];//耗时不耗cpu
while true 中添加这段代码耗时操作,cpu重新分配执行时间
  • 打赏
  • 举报
回复
A线程和B线程中的list是两个类中的成员变量,A线程的成员变量变化对B线程的成员变量毫无影响,所以B线程中的成员变量就一直是初始状态,if判断就一直不成立!
melsec88 2019-01-29
  • 打赏
  • 举报
回复
新手来看看
vvvwwwq 2019-01-26
  • 打赏
  • 举报
回复
来学习参考下
qq_44465284 2019-01-09
  • 打赏
  • 举报
回复
不如啊 你放弃吧
  • 打赏
  • 举报
回复
学习一下,自学
qq_44213691 2018-12-22
  • 打赏
  • 举报
回复
好好参照查看
qq_14823253 2018-11-02
  • 打赏
  • 举报
回复
引用 29 楼 qq_39936465 的回复:
[quote=引用 27 楼 qq_14823253 的回复:] 不知道大家有没有看清题主的问题:想问下,为什么b线程中设置抛异常的语句没有执行? 这个问题比较有意思,我上大学的时候也遇到过类似的问题:在两个线程A\B中分别打印两个数组(长度一样),发现并不是每次打印A\B都会交替打印,这个涉及到CPU时间片 一般情况下,宏观上线程并行,但实际上只有就绪状态的线程在获得CPU时间片后才会运行,题主的while (true) 可能导致其运行过程中放弃了时间片,放弃过程中myList.size()可能已经大于5了,题主可以尝试while (true) 中输出一些内容(if (myList.size() == 5){}外输出)来获取时间片,在不同系统中结果是不一样的
编程的目的是为了能在大多数机器上运行,并能达到所想要的效果,这需要避免因运行环境对程序产生的影响。题主的问题就是程序的运行环境才生影响造成的,分析运行环境对解决编程来说没有太大意义,因为我们编程不可能让程序只有在特定的运行环境下,才能达到想要的效果,为了解决这个问题所以才引入了同步概念。多进程都会或多或少的受到运行环境影响,都需要加入同步。[/quote] 题主运行的可能是反例,旨在让读者明白线程同步的重要,可是这个程序可能并没有很好的体现反例,并不是要求大家讲解如何同步
qq_39936465 2018-11-01
  • 打赏
  • 举报
回复
引用 27 楼 qq_14823253 的回复:
不知道大家有没有看清题主的问题:想问下,为什么b线程中设置抛异常的语句没有执行? 这个问题比较有意思,我上大学的时候也遇到过类似的问题:在两个线程A\B中分别打印两个数组(长度一样),发现并不是每次打印A\B都会交替打印,这个涉及到CPU时间片 一般情况下,宏观上线程并行,但实际上只有就绪状态的线程在获得CPU时间片后才会运行,题主的while (true) 可能导致其运行过程中放弃了时间片,放弃过程中myList.size()可能已经大于5了,题主可以尝试while (true) 中输出一些内容(if (myList.size() == 5){}外输出)来获取时间片,在不同系统中结果是不一样的
编程的目的是为了能在大多数机器上运行,并能达到所想要的效果,这需要避免因运行环境对程序产生的影响。题主的问题就是程序的运行环境才生影响造成的,分析运行环境对解决编程来说没有太大意义,因为我们编程不可能让程序只有在特定的运行环境下,才能达到想要的效果,为了解决这个问题所以才引入了同步概念。多进程都会或多或少的受到运行环境影响,都需要加入同步。
qq_14823253 2018-11-01
  • 打赏
  • 举报
回复
引用 27 楼 qq_14823253 的回复:
不知道大家有没有看清题主的问题:想问下,为什么b线程中设置抛异常的语句没有执行? 这个问题比较有意思,我上大学的时候也遇到过类似的问题:在两个线程A\B中分别打印两个数组(长度一样),发现并不是每次打印A\B都会交替打印,这个涉及到CPU时间片 一般情况下,宏观上线程并行,但实际上只有就绪状态的线程在获得CPU时间片后才会运行,题主的while (true) 可能导致其运行过程中放弃了时间片,放弃过程中myList.size()可能已经大于5了,题主可以尝试while (true) 中输出一些内容(if (myList.size() == 5){}外输出)来获取时间片,在不同系统中结果是不一样的
说的可能不准,while (true) 的时间片用的比较快,哈哈哈
qq_14823253 2018-11-01
  • 打赏
  • 举报
回复
不知道大家有没有看清题主的问题:想问下,为什么b线程中设置抛异常的语句没有执行? 这个问题比较有意思,我上大学的时候也遇到过类似的问题:在两个线程A\B中分别打印两个数组(长度一样),发现并不是每次打印A\B都会交替打印,这个涉及到CPU时间片 一般情况下,宏观上线程并行,但实际上只有就绪状态的线程在获得CPU时间片后才会运行,题主的while (true) 可能导致其运行过程中放弃了时间片,放弃过程中myList.size()可能已经大于5了,题主可以尝试while (true) 中输出一些内容(if (myList.size() == 5){}外输出)来获取时间片,在不同系统中结果是不一样的
加载更多回复(26)
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .
目录 引言 ...................................................................................................................................... I 第一章程序和程序设计 .......................................................................................................1 §1.1 什么是程序 ?............................................................................................................1 1.1.1 算法.................................................................................................................2 1.1.2 实体.................................................................................................................3 1.1.3 程序.................................................................................................................3 1.1.4 程序设计 .........................................................................................................4 §1.2 程序设计方法与语言 ..............................................................................................5 1.2.1 早期的程序设计 .............................................................................................5 1.2.2 结构化程序设计 .............................................................................................5 1.2.3 面向对象程序设计 .........................................................................................6 §1.3 一个完整的 Java程序.............................................................................................6 1.3.1 Java程序的结构 ..............................................................................................8 1.3.2 Java程序的退化结构 ......................................................................................9 1.3.3 Java程序的运行 ............................................................................................10 1.3.4 Java程序的调试 ............................................................................................11 §1.4 面向对象程序的构造 ............................................................................................11 内容小结.........................................................................................................................12 思考与练习.....................................................................................................................12 上机实习题.....................................................................................................................12 小课题:抽象与抽象层次.............................................................................................13 小课题:程序设计语言的历史.....................................................................................13 第二章基本数据类型 .........................................................................................................14 §2.1 数据类型概述 ........................................................................................................14 2.1.1 什么是类型? ...............................................................................................14 2.1.2 类型的作用 ...................................................................................................14 2.1.3 Java语言的类型 ............................................................................................15 §2.2 程序中的单词 ........................................................................................................15 2.2.1 单词分类 .......................................................................................................15 2.2.2 保留字...........................................................................................................15 2.2.3 标识符...........................................................................................................16 2.2.4 程序中的空白 ...............................................................................................16 §2.3 变量与赋值 ............................................................................................................17 2.3.1 确定数据类型 ...............................................................................................17 2.3.2 变量的要素 ...................................................................................................17 2.3.3 赋值运算 .......................................................................................................18 2.3.4 程序的输出 ...................................................................................................18 §2.4 Java语言的简单类型 .............................................................................................18 2.4.1 字符类型 .......................................................................................................19 2.4.2 整数类型 .......................................................................................................19 2.4.3 浮点数类型和双精度浮点数类型 ...............................................................20 2.4.4 布尔类型 .......................................................................................................20 2.4.5 字符串类型 ...................................................................................................21 2.4.6 符号常量 .......................................................................................................21 §2.5 表达式....................................................................................................................22 - i - 2.5.1 表达式...........................................................................................................22 2.5.2 算术运算 .......................................................................................................22 2.5.3 关系运算 .......................................................................................................23 2.5.4 逻辑运算 .......................................................................................................23 2.5.5 类型转换 .......................................................................................................24 2.5.6 一个小小应用程序 .......................................................................................24 §2.6 编写简单应用程序 ................................................................................................25 2.6.1 最简单的程序 ...............................................................................................25 2.6.2 引入变量的程序 ...........................................................................................26 2.6.3 程序的输入 ...................................................................................................26 2.6.4 完整的程序 ...................................................................................................27 内容小结.........................................................................................................................28 思考与练习.....................................................................................................................28 上机实习题.....................................................................................................................29 小课题:构造性思维方法.............................................................................................29 第三章基本控制结构 .........................................................................................................30 §3.1 简单语句 ................................................................................................................30 §3.2 结构化控制结构 ....................................................................................................30 3.2.1 程序的控制结构 ...........................................................................................30 3.2.2 结构化程序设计工具 ...................................................................................31 3.2.3 盒图与伪码 ...................................................................................................31 §3.3 选择结构 ..............................................................................................................33 3.3.1 不带 else的 if语句 ......................................................................................33 3.3.2 带 else的 if语句 ..........................................................................................35 3.3.3 嵌套 if语句 ..................................................................................................36 3.3.4 垂悬 else问题 ..............................................................................................38 §3.4 循环结构 ..............................................................................................................39 3.4.1 while语句......................................................................................................39 3.4.2 break语句和 continue语句 ..........................................................................42 3.4.3 do_while语句................................................................................................44 3.4.4 for语句..........................................................................................................46 §3.5 原始算法与精美算法 ............................................................................................47 3.5.1 求解问题的精美算法 ...................................................................................47 3.5.2 求解问题的原始算法 ...................................................................................48 §3.6 一个应用程序例子 ................................................................................................48 内容小结.........................................................................................................................50 思考与练习.....................................................................................................................51 上机实习题.....................................................................................................................52 第四章方法.........................................................................................................................53 §4.1 例程机制 ................................................................................................................53 4.1.1 分而治之与软件重用 ...................................................................................53 4.1.2 Java语言的方法 ............................................................................................54 4.1.3 两个例子 .......................................................................................................54 §4.2 方法的声明与调用 ................................................................................................56 4.2.1 方法的声明 ...................................................................................................56 4.2.2 方法的调用 ...................................................................................................57 4.2.3 方法的接口与实现 .......................................................................................58 §4.3 方法的参数 ............................................................................................................59 4.3.1 参数设计 .......................................................................................................59 4.3.2 按值调用 .......................................................................................................61 §4.4 标识符的作用域 ....................................................................................................61 - ii - 4.4.1 作用域规则 ...................................................................................................62 4.4.2 标识符命名冲突 ...........................................................................................63 §4.5 使用 Java API ........................................................................................................63 4.5.1 数值运算 .......................................................................................................63 4.5.2 伪随机数 .......................................................................................................64 §4.6 递归程序设计 ........................................................................................................65 4.6.1 简单递归程序 ...............................................................................................65 4.6.2 梵塔问题 .......................................................................................................66 内容小结.........................................................................................................................67 思考与练习.....................................................................................................................68 上机实习题.....................................................................................................................69 小课题:计算机辅助教学.............................................................................................69 第五章类与对象 .................................................................................................................70 §5.1 声明一个类 ............................................................................................................70 5.1.1 类的声明 .......................................................................................................70 5.1.2 类成员的访问控制 .......................................................................................71 5.1.3 类作用域 .......................................................................................................72 §5.2 创建对象实例 ........................................................................................................73 5.2.1 对象的声明与使用 .......................................................................................73 5.2.2 对象的初始化 ...............................................................................................74 5.2.3 静态成员 .......................................................................................................76 5.2.4 对象的参数传递方式 ...................................................................................78 §5.3 变量和对象实例的生存期 ....................................................................................79 5.3.1变量的生存期 ................................................................................................80 5.3.2对象实例的生存期 ........................................................................................80 §5.4 字符串类 String.....................................................................................................82 5.4.1 使用 String类型的对象 ...............................................................................82 5.4.2 类 String的主要方法 ...................................................................................82 5.4.3 使用字符串对象的例子 ...............................................................................84 §5.5 关于类和对象的进一步讨论 ................................................................................86 5.5.1 基本数据类型的包装类 ...............................................................................86 5.5.2 抽象数据类型 ...............................................................................................87 5.5.3 设计良好的类接口 .......................................................................................88 5.5.4 再论对象 .......................................................................................................88 5.5.5 再论 Java语言的类......................................................................................89 内容小结.........................................................................................................................90 思考与练习.....................................................................................................................90 上机练习题.....................................................................................................................92 小课题:命令行交互方式.............................................................................................92 第六章复合数据类型 .........................................................................................................93 §6.1 使用数组变量 ........................................................................................................93 6.1.1 数组变量的声明 ...........................................................................................93 6.1.2 访问数组元素 ...............................................................................................94 6.1.3 数组作为参数传递 .......................................................................................95 §6.2 数组应用举例 ........................................................................................................96 6.2.1 学生成绩管理 ...............................................................................................96 6.2.2 完整的程序 ...................................................................................................96 6.2.3 冒泡排序法 ...................................................................................................99 §6.3 使用二维数组变量 ..............................................................................................100 6.3.1 什么是二维数组? .....................................................................................100 6.3.2 使用二维数组 .............................................................................................101 - iii - 6.3.3 二维数组应用举例 .....................................................................................101 §6.4 一个扑克牌游戏程序 ..........................................................................................102 6.4.1 分析问题 .....................................................................................................102 6.4.2 建模.............................................................................................................103 6.4.3 完整的程序 .................................................................................................103 §6.5 高级数据结构的构造 ..........................................................................................106 §6.6 对象实例的复制与比较 ......................................................................................108 6.6.1 对象实例的复制 .........................................................................................108 6.6.2 对象实例的比较 .........................................................................................112 内容小结.......................................................................................................................113 思考与练习...................................................................................................................113 上机实习题...................................................................................................................115 第七章继承与多态 ...........................................................................................................116 §7.1 继承的基本概念 ..................................................................................................116 7.1.1 IS-A关系..................................................................................................116 7.1.2 继承机制 .....................................................................................................116 7.1.3 继承的作用 .................................................................................................117 7.1.4 继承与软件重用 .........................................................................................118 §7.2 Java语言的继承机制 ...........................................................................................118 7.2.1 继承的语法 .................................................................................................118 7.2.2 继承与成员访问控制 .................................................................................120 7.2.3 继承成员的调整 .........................................................................................121 7.2.4 子类对象实例的存储组织 .........................................................................122 7.2.5 继承与对象初始化及收尾 .........................................................................124 7.2.6 继承与子类型 .............................................................................................125 §7.3 多态性的基本概念 ..............................................................................................126 7.3.1 程序的多态性 .............................................................................................126 7.3.2 表示独立性 .................................................................................................127 §7.4 方法重载 ..............................................................................................................127 7.4.1 方法重载的途径 .........................................................................................128 7.4.2 方法重载的二义性 .....................................................................................130 7.4.3 构造方法的重载 .........................................................................................133 §7.5 动态绑定 ..............................................................................................................133 §7.6 对继承和多态的进一步讨论 ..............................................................................135 7.6.1 单继承与多继承 .........................................................................................135 7.6.2 最终类与抽象类 .........................................................................................136 7.6.3 类属机制 .....................................................................................................139 7.6.4 类层次设计 .................................................................................................140 内容小结.......................................................................................................................141 思考与练习...................................................................................................................142 上机实习题...................................................................................................................146 小课题:为 Java语言引入类属机制 ..........................................................................147 第八章接口与程序包 .......................................................................................................148 §8.1 接口......................................................................................................................148 8.1.1 接口的作用 .................................................................................................148 8.1.2 接口的声明 .................................................................................................149 8.1.3 接口与类 .....................................................................................................150 8.1.4 接口的继承 .................................................................................................154 8.1.5 接口与多态性 .............................................................................................155 §8.2 程序包..................................................................................................................157 8.2.1 Java程序的组织 ..........................................................................................157 - iv - 8.2.2 程序包的定义 .............................................................................................158 8.2.3 程序包的引入 .............................................................................................159 8.2.4 包级访问控制 .............................................................................................161 8.2.5 Java的系统程序包 ......................................................................................163 §8.3 嵌套类..................................................................................................................164 8.3.1 嵌套类的种类 .............................................................................................164 8.3.2 内部类.........................................................................................................165 8.3.3 回调机制 .....................................................................................................168 8.3.4 静态类.........................................................................................................171 内容小结.......................................................................................................................171 思考与练习...................................................................................................................172 上机实习题...................................................................................................................177 第九章异常处理与断言 ...................................................................................................178 §9.1 异常处理的基本概念 ..........................................................................................178 9.1.1 异常处理 .....................................................................................................178 9.1.2 异常处理的模式 .........................................................................................179 §9.2 Java语言的异常处理机制 ...................................................................................180 9.2.1 异常的分类 .................................................................................................180 9.2.2 Java标准异常简介 ......................................................................................181 9.2.3 异常的捕获与处理 .....................................................................................182 9.2.4 异常的匹配 .................................................................................................184 9.2.5 异常处理与收尾 .........................................................................................184 9.2.6 异常处理与构造方法 .................................................................................186 9.2.7 异常的转发 .................................................................................................187 9.2.8 异常声明与方法重载 .................................................................................188 9.2.9 异常处理与继承机制 .................................................................................188 §9.3 程序断言机制 ......................................................................................................191 9.3.1 程序断言 .....................................................................................................191 9.3.2 程序断言的用法 .........................................................................................192 9.3.3 在 Java语言中实现部分断言....................................................................193 内容小结.......................................................................................................................195 思考与练习...................................................................................................................195 上机实习题...................................................................................................................197 第十章输入/输出流 .......................................................................................................198 §10.1输入/输出基本概念 ........................................................................................198 10.1.1 外部设备与文件 .......................................................................................198 10.1.2 文件的基本概念 .......................................................................................198 10.1.3 输入/输出流 ...........................................................................................199 §10.2 Java流系统概述 .................................................................................................199 10.2.1 面向字节的输入流类 ...............................................................................200 10.2.2 面向字节的输出流类 ...............................................................................201 10.2.3 面向字符的输入流类 ...............................................................................203 10.2.4 面向字符的输出流类 ...............................................................................204 10.2.5 Java API定义的流对象 ............................................................................205 §10.3文件流................................................................................................................206 10.3.1 文件及文件目录的操作 ...........................................................................206 10.3.2 文件内容的顺序读写 ...............................................................................208 10.3.3 文件内容的随机读写 ...............................................................................209 §10.4过滤器流 ............................................................................................................210 10.4.1 装饰模式 ...................................................................................................210 10.4.2 数据转换流 ...............................................................................................211 - v - 10.4.3 带行号的输入流 .......................................................................................212 10.4.4 设计自己的过滤器流 ...............................................................................213 §10.5对象串行化 ........................................................................................................215 10.5.1 对象串行化的作用 ...................................................................................215 10.5.2 对象串行化的基本方法 ...........................................................................216 10.5.3 串行化自己的对象 ...................................................................................217 §10.6其它类型的流简介 ............................................................................................219 10.6.1 管道流 .......................................................................................................219 10.6.2 连接流 .......................................................................................................220 内容小结.......................................................................................................................221 思考与练习...................................................................................................................222 上机实习题...................................................................................................................222 小课题:设计词法分析程序.......................................................................................223 第十一章对象容器...........................................................................................................224 §11.1 对象容器的基本概念 ........................................................................................224 §11.2 Java对象容器概述 .............................................................................................225 11.2.1 Java对象容器接口及其骨架类 ................................................................225 11.2.2 Java的对象容器类 ....................................................................................226 11.2.3支持对象容器的辅助工具 ........................................................................228 §11.3 迭代器................................................................................................................229 11.3.1迭代器设计模式 ........................................................................................229 11.3.2迭代器的基本用法 ....................................................................................230 11.3.3列表专用迭代器 ........................................................................................230 11.3.4旧版本的枚举接口 ....................................................................................232 §11.4 类集容器 ............................................................................................................232 11.4.1类集容器接口 ............................................................................................232 11.4.2列表容器 ....................................................................................................235 11.4.3集合容器 ....................................................................................................238 §11.5 映射容器 ............................................................................................................240 11.5.1映射容器接口 ............................................................................................240 11.5.2映射容器类 ................................................................................................245 §11.6 对象容器操纵工具 ............................................................................................247 11.6.1数组操纵工具 ...........................................................................................247 11.6.2容器操纵工具 ...........................................................................................249 内容小结.......................................................................................................................251 思考与练习...................................................................................................................252 上机实习题...................................................................................................................253 小课题:对象容器的性能比较...................................................................................253 第十二章图形用户界面...................................................................................................255 §12.1用户界面设计概述 ............................................................................................255 12.1.1 用户界面设计原则 ...................................................................................255 12.1.2 用户界面设计内容 ...................................................................................256 §12.2 Java程序的用户界面设计 .................................................................................257 12.2.1 Java程序的用户界面 ................................................................................257 12.2.2 GUI系统的组成........................................................................................257 12.2.3 AWT和 Swing组件 ..................................................................................258 §12.3 Swing概述 .........................................................................................................258 12.3.1 Swing组件 ................................................................................................258 12.3.2 Swing的 M-UI设计模式 .........................................................................259 12.3.3 Swing的事件处理模式.............................................................................260 12.3.4 一个简单的 GUI程序..............................................................................262 - vi - 12.3.5 类 JComponent简介.................................................................................265 §12.4 Swing顶层容器 .................................................................................................268 12.4.1 画框的使用 ...............................................................................................268 12.4.2 对话框的使用 ...........................................................................................269 §12.5 Swing中间容器 .................................................................................................272 12.5.1 分隔窗格的使用 .......................................................................................272 12.5.2 滚动窗格的使用 .......................................................................................273 12.5.3 带标签窗格的使用 ...................................................................................278 12.5.4 工具条的使用 ...........................................................................................280 §12.6 Swing原子控件 .................................................................................................281 12.6.1 标签的使用 ...............................................................................................281 12.6.2 按钮的使用 ...............................................................................................283 12.6.3 检查框的使用 ...........................................................................................286 12.6.4 广播按钮的使用 .......................................................................................289 12.6.5 组合框的使用 ...........................................................................................290 12.6.6 列表的使用 ...............................................................................................294 12.6.7 文本控件的使用 .......................................................................................300 12.6.8 表格的使用 ...............................................................................................307 12.6.9 菜单的使用 ...............................................................................................311 §12.7 Swing的布局管理 .............................................................................................316 12.7.1 布局管理器概述 .......................................................................................316 12.7.2 顺序布局管理器 .......................................................................................317 12.7.3 边界布局管理器 .......................................................................................318 12.7.4 网格布局管理器 .......................................................................................318 12.7.5 网格包布局管理器 ...................................................................................319 12.7.6 盒式布局管理器 .......................................................................................321 12.7.7 卡片布局管理器 .......................................................................................322 12.7.8 组件的绝对定位 .......................................................................................323 12.7.9 边框的使用 ...............................................................................................324 §12.8编写小应用程序 ................................................................................................328 12.8.1 Applet的特点 ............................................................................................328 12.8.2 Applet的编程模式 ....................................................................................328 12.8.3 Applet的编程举例 ....................................................................................330 内容小结.......................................................................................................................332 思考与练习...................................................................................................................332 上机实习题...................................................................................................................333 第十三章数据库编程初步...............................................................................................334 §13.1关系数据库与 SQL简介 ..................................................................................334 13.1.1 关系数据库的基本概念 ...........................................................................334 13.1.2 创建关系数据库举例 ...............................................................................334 13.1.3 SQL简介 ...................................................................................................337 §13.2 JDBC结构与原理..............................................................................................341 13.2.1 数据库应用的多层结构 ...........................................................................341 13.2.2 JDBC的结构.............................................................................................342 13.2.3 建立使用 JDBC的运行环境 ...................................................................343 §13.3 JDBC应用入门..................................................................................................344 13.3.1 使用 JDBC的编程模式 ...........................................................................344 13.3.2 Java与 SQL间的数据类型映射 ..............................................................347 13.3.3 使用数据表的元信息 ...............................................................................349 13.3.4 封装与数据库访问有关的操作 ...............................................................350 §13.4数据库应用程序举例 ........................................................................................353 - vii - 13.4.1 需求分析 ...................................................................................................353 13.4.2 系统设计 ...................................................................................................354 13.4.3 编码实现 ...................................................................................................356 内容小结.......................................................................................................................367 思考与练习...................................................................................................................368 上机实习题...................................................................................................................369 第十四章多线程编程.......................................................................................................370 §14.1线程的基本概念 ................................................................................................370 14.1.1 什么是线程? ...........................................................................................370 14.1.2 Java程序中的线程 ....................................................................................370 §14.2线程生存期与线程调度 ....................................................................................371 14.2.1 创建线程 ...................................................................................................371 14.2.2 Java程序的主线程 ....................................................................................373 14.2.3 线程的生存期 ...........................................................................................373 14.2.4 使用 yield()方法 .......................................................................................374 14.2.5 优先级与线程调度 ...................................................................................375 14.2.6 线程组 .......................................................................................................377 14.2.7 守护线程 ...................................................................................................378 §14.3资源共享与线程同步 ........................................................................................379 14.3.1 线程安全性 ...............................................................................................379 14.3.2 同步代码段与锁 .......................................................................................380 14.3.3 设计线程安全的应用程序 .......................................................................382 §14.4其他线程通信方式 ............................................................................................383 14.4.1 使用 sleep()方法.......................................................................................383 14.4.2 使用 join()方法.........................................................................................383 14.4.3 使用 wait()/notify()/notifyAll()方法.........................................................384 14.4.4 使用 I/O操作 ...........................................................................................386 14.4.5 不主张使用的方法 ...................................................................................386 §14.5使用定器 ........................................................................................................387 14.5.1 通用定器 ...............................................................................................387 14.5.2 Swing专用定器.....................................................................................389 §14.6高级多线程设计 ................................................................................................389 14.6.1 并发模型 ...................................................................................................389 14.6.2 互斥问题 ...................................................................................................391 14.6.3 生产者∕消费者问题 ...............................................................................393 内容小结.......................................................................................................................396 思考与练习...................................................................................................................396 上机实习题...................................................................................................................397 小课题:资源池与线程池...........................................................................................397 第十五章网络通信编程...................................................................................................399 §15.1网络通信的基本概念 ........................................................................................399 15.1.1 通信协议 ...................................................................................................399 15.1.2 TCP与 UDP ..............................................................................................401 15.1.3 端口...........................................................................................................401 15.1.4 Java对网络通信的支持 ............................................................................402 §15.2基于 URL的通信..............................................................................................403 15.2.1 使用 URL对象.........................................................................................403 15.2.2 使用 URL连接.........................................................................................405 §15.3基于 TCP的通信 ..............................................................................................407 15.3.1 指定主机 ...................................................................................................407 15.3.2 基于 socket的 C/S编程...........................................................................408 - viii - 15.3.3 多线程服务程序 .......................................................................................411 §15.4典型的因特网应用 ............................................................................................413 15.4.1 一个简单的端口扫描程序 .......................................................................413 15.4.2 一个简单的 HTTP服务程序...................................................................414 15.4.3 一个简单的 Telnet客户程序...................................................................415 15.4.4 一个简单的 SMTP客户程序 ..................................................................417 §15.5基于 UDP的通信..............................................................................................418 15.5.1 单播通信 ...................................................................................................418 15.5.2 多播通信 ...................................................................................................422 内容小结.......................................................................................................................424 思考与练习...................................................................................................................424 上机实习题...................................................................................................................425 第十六章结束语...............................................................................................................426 §16.1设计原则 ............................................................................................................426 16.1.1 设计原则与设计模式 ...............................................................................426 16.1.2 B. Meyer的设计原则................................................................................426 16.1.3 R. Martin的设计原则 ...............................................................................427 §16.2设计模式 ............................................................................................................428 16.2.1 什么是模式 ...............................................................................................428 16.2.2 GoF设计模式 ............................................................................................429 16.2.4 POSA设计模式.........................................................................................431 16.2.5 反模式 .......................................................................................................431 §16.3分布式对象技术 ................................................................................................432 16.3.1 进程内通信与进程间通信 .......................................................................432 16.3.2 实现网络通信的途径 ...............................................................................432 16.3.3 分布式对象系统 .......................................................................................432 内容小结.......................................................................................................................433 思考与练习...................................................................................................................433 上机实习题...................................................................................................................434
软件设计师考试真题 附带2010年的考试大纲 考试科目1:计算机与软件工程知识  1.计算机科学基础   1.1 数制及其转换      • 二进制、十进制和十六进制等常用制数制及其相互转换   1.2 数据的表示      • 数的表示(原码、反码、补码、移码表示,整数和实数的机内表示,精度和溢出)      • 非数值表示(字符和汉字表示、声音表示、图像表示)      • 校验方法和校验码(奇偶校验码、海明校验码、循环冗余校验码)   1.3 算术运算和逻辑运算      • 逻辑代数的基本运算和逻辑表达式的化简   1.4 数学基础知识      • 命题逻辑、谓词逻辑、形式逻辑的基础知识      • 常用数值计算(误差、矩阵和行列式、近似求解方程、插值、数值积分)      • 排列组合、概率论应用、应用统计(数据的统计分析)      • 运算基本方法(预测与决策、线性规划、网络图、模拟)   1.5 常用数据结构      • 数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、线索树、堆)、图等的定义、存储和操作      • Hash(存储地址计算,冲突处理)   1.6 常用算法      • 排序算法、查找算法、数值计算方法、字符串处理方法、数据压缩算法、递归算法、图的相关算法      • 算法与数据结构的关系、算法效率、算法设计、算法描述(流程图、伪代码、决策表)、算法的复杂性  2.计算机系统知识   2.1 硬件知识    2.1.1 计算机系统的组成、体系结构分类及特性      • CPU和存储器的组成、性能和基本工作原理      • 常用I/O设备、通信设备的性能,以及基本工作原理      • I/O接口的功能、类型和特性      • I/O控制方式(中断系统、DMA、I/O处理机方式)      • CISC/RISC,流水线操作,多处理机,并行处理   2.1.2 存储系统      • 主存-Cache存储系统的工作原理      • 虚拟存储器基本工作原理,多级存储体系的性能价格      • RAID类型和特性   2.1.3 安全性、可靠性与系统性能评测基础知识      • 诊断与容错      • 系统可靠性分析评价      • 计算机系统性能评测方式   2.2 软件知识    2.2.1 操作系统知识      • 操作系统的内核(中断控制)、进程、线程概念      • 处理机管理(状态转换、共享与互斥、分轮转、抢占、死锁)      • 存储管理(主存保护、动态连接分配、分段、分页、虚存)      • 设备管理(I/O控制、假脱机)      • 文件管理(文件目录、文件组织、存取方法、存取控制、恢复处理)      • 作业管理(作业调度、作业控制语言(JCL)、多道程序设计)      • 汉字处理,多媒体处理,人机界面      • 网络操作系统和嵌入式操作系统基础知识      • 操作系统的配置    2.2.2 程序设计语言和语言处理程序的知识      • 汇编、编译、解释系统的基础知识和基本工作原理      • 程序设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用      • 各类程序设计语言主要特点和适用情况   2.3 计算机网络知识      • 网络体系结构(网络拓扑、OSI/RM、基本的网络协议)      • 传输介质、传输技术、传输方法、传输控制      • 常用网络设备和各类通信设备      • Client/Server结构、Browser/Server结构      • LAN拓扑,存取控制,LAN的组网,LAN间连接,LAN-WAN连接      • 因特网基础知识以及应用      • 网络软件      • 网络管理      • 网络性能分析   2.4 数据库知识      • 数据库管理系统的功能和特征      • 数据库模型(概念模式、外模式、内模式)      • 数据模型,ER图,第一范式、第二范式、第三范式      • 数据操作(集合运算和关系运算)      • 数据库语言(SQL)      • 数据库的控制功能(并发控制、恢复、安全性、完整性)      • 数据仓库和分布式数据库基础知识   2.5 多媒体知识      • 多媒体系统基础知识,多媒体设备的性能特性,常用多媒体文件格式      • 简单图形的绘制,图像文件的处理方法      • 音频和视频信息的应用      • 多媒体应用开发过程   2.6 系统性能知识      • 性能指标(响应间、吞吐量、周转间)和性能设计     

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧