面向字符的输入流
字符流是按字符而不是按字节来读写的:源或目标通常是文本文件。java.io 里所有字符流的父类是 Reader 和 Writer,二者都是抽象类,实际工作要靠子类。 子类可以分成两类:直接对接数据源或目的地的叫节点流,在流上再做缓冲、转换等处理的叫处理流。本节先看面向字符的输入流。 一、Reader…
字符流是按字符而不是按字节来读写的:源或目标通常是文本文件。java.io 里所有字符流的父类是 Reader 和 Writer,二者都是抽象类,实际工作要靠子类。 子类可以分成两类:直接对接数据源或目的地的叫节点流,在流上再做缓冲、转换等处理的叫处理流。本节先看面向字符的输入流。 一、Reader…
两个或两个以上线程要共享资源时,必须保证某一刻只有一条线程占用。这个过程叫同步(synchronization)。Java 在语言层面提供了支持。 关键概念是管程(也叫信号量 semaphore):一个互斥独占锁定,或称互斥体(mutex)。同一时刻只有一条线程能获得管程;其他试图进入已锁定管程的线…
同步方法能挡住其他线程同时进同一个对象,但还不够精巧。生产者一边造数据、消费者一边用,还要互相等对方干完——如果靠轮询死循环盯条件,会浪费大量 CPU。 Java 用 wait()、notify()、notifyAll() 做线程间通信。它们是 Object 的 final 方法,必须在 synch…
到目前为止只用到两条线程:主线程和一个子线程。程序可以按需要创建更多。下面这个例子创建了三个子线程 One、Two、Three。 每个 NewThread 在构造函数里 start(),从 5 数到 1,每次睡 1 秒。主线程用 sleep(10000) 睡十秒,确保自己最后结束。 线程 做什么 等…
多数情况通过实例化一个 Thread 对象来创建线程。Java 定义了两种方式:实现 Runnable 接口,或继承 Thread 类。 方式 入口 适用 implements Runnable new Thread(this, name) 再 start() 不必改 Thread 其他方法时优先 …
Java 程序一启动,立刻有一条线程在跑,通常叫主线程(main thread),因为它从程序开始就执行。 主线程重要在两头:它是产生其他子线程的线程;通常它必须最后结束,因为它还要做各种关闭动作。 主线程虽是自动创建的,但仍可用 Thread 对象控制。先调公有静态方法 currentThread…
Java 运行时在很多方面依赖线程,类库设计也按多线程来考虑。实际上 Java 用线程让整个环境异步,避免 CPU 空转浪费。 对照单线程更容易看清优势。单线程常用轮询事件循环:一条线程在无限循环里询问事件序列,决定下一步。一旦某处理程序占住,别的事件只能等。线程因为等资源阻塞时,整个程序停住。 一…
和其他多数语言不同,Java 内置支持多线程。多线程程序包含两条或两条以上并发运行的部分,每一部分叫一个线程(thread),各有独立执行路径。多线程是多任务处理的一种特殊形式。 多任务处理几乎被所有现代操作系统支持,但分两种:基于进程的和基于线程的。把两者分清很重要。 一、进程与线程 进程(pro…
学过数据结构的人对双向链表都不陌生。用 Java 怎么实现?链表在内存里并不连续,逻辑顺序靠指针串起来。每个结点有数据域,还有指向其它结点的引用。 单链表只有后继。要对某个结点的前驱动手,只能从头再走一遍,很麻烦。双向链表多一个指向父结点的引用,前后都能走。 一、结点:数据 + 父指针 + 子指针 …
线性表、链表、哈希表是常用数据结构。做 Java 开发时,JDK 已经在 java.util 里准备好了一套类。下面按接口把各自的职责和使用方式理清。 记住两棵树:Collection(单列)和 Map(键值)。SDK 不提供直接实现 Collection 的类,实现都落在 List、Set 这些子…