并发
两种常见的并发类型:
共享内存 和消息传递。
进程和线程:
进程是计算机上正在运行的程序的实例,与其他进程相互独立,并且在内存里有独立的存储空间。进程的存储空间不允许共享(特殊机制下可以),并在Java中使用标准的输入输出流进行信息传递。
线程是运行程序中的一个控制点,可以想象为正在运行的程序中的一个位置。在Java SE doc中也被称为轻量级进程。线程共享进程的内存。(特殊机制下也可以享受线程本地内存)线程进行信息传递要利用队列数据结构。
要在只有单或双处理器的计算机中现实多线程的操作,就要靠时间片来模拟并发操作,也就是处理器在不同线程间切换。
Java SE doc介绍了两种方法来定义一个线程
-
Runnable接口
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
- 继承
Thread
public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
}
}
doc中说明了因为第一种方法还可以继承其他的类,而第二种则必须限制在为Thread的子类,所以第一种方法更为常用和通用。第二种在较为简单的程序中实际上也可用。
但课程中直接说:
Never use their second way (subclassing
Thread).
Always implement theRunnableinterface and use thenew Thread(..)constructor.
并介绍了另一种定义线程的方法,这种方法可以不为类命名:
new Thread(new Runnable() {
public void run() {
System.out.println("Hello from a thread!");
}
}).start();
因为并发错误很难测试和定位,所以需要特别注意和避免,在下一节我们会涉及到如何避免。










网友评论