利用对象,可将一个程序分割成相互独立的区域。我们通常也需要将一个程序转换成多个独立运行的子任务。
象这样的每个子任务都叫作一个“线程”(Thread)。编写程序时,可将每个线程都想象成独立运行,而且都有自己的专用CPU。一些基础机制实际会为我们自动分割CPU的时间。我们通常不必关心这些细节问题,所以多线程的代码编写是相当简便的。
这时理解一些定义对以后的学习狠有帮助。“进程”是指一种“自包容”的运行程序,有自己的地址空间。“多任务”操作系统能同时运行多个进程(程序)——但实际是由于CPU分时机制的作用,使每个进程都能循环获得自己的CPU时间片。但由于轮换速度非常快,使得所有程序好象是在“同时”运行一样。“线程”是进程内部单一的一个顺序控制流。因此,一个进程可能容纳了多个同时执行的线程。
多线程的应用范围很广。但在一般情况下,
### 多线程概念与应用
#### 一、线程基本概念
在计算机科学领域,线程(Thread)是程序中的最小执行单元,是进程的一部分。一个进程可以包含多个线程,这些线程共享相同的内存空间,每个线程拥有独立的执行路径。线程能够并行执行任务,提高程序的效率。
#### 二、进程与多任务操作系统
1. **进程**:一个进程是指一个正在运行的程序实例,它包括了程序的代码、数据以及操作系统为其分配的资源(如内存)。
2. **多任务操作系统**:现代操作系统能够支持多个进程的同时运行。这种能力主要通过操作系统的调度策略实现,即通过快速地在不同进程之间切换CPU时间来模拟多任务并行的效果。
#### 三、线程的优势
- **资源共享**:同一进程内的多个线程可以共享该进程的数据和资源,减少数据交换的成本。
- **通信简便**:线程间的通信比进程间通信更为简单,因为它们处于同一个内存空间内。
- **调度开销小**:相较于创建新的进程,创建新线程的开销较小,这使得线程更适用于高并发场景。
#### 四、多线程编程示例
以下是一个简单的Java多线程编程示例,通过`Thread`类实现一个计数器程序,该程序包含用户界面,用户可以通过按钮控制计数器的启动和停止:
```java
//:Counter1.java
package c14;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Counter1 extends Applet {
private int count = 0;
private Button onOff = new Button("Toggle");
private Button start = new Button("Start");
private TextField t = new TextField(10);
private boolean runFlag = true;
public void init() {
add(t);
start.addActionListener(new StartL());
add(start);
onOff.addActionListener(new OnOffL());
add(onOff);
}
public void go() {
while (true) {
try {
Thread.currentThread().sleep(100); // 让当前线程休眠100毫秒
} catch (InterruptedException e) {
// 处理中断异常
}
if (runFlag) {
t.setText(Integer.toString(count++)); // 更新计数器
}
}
}
class StartL implements ActionListener {
public void actionPerformed(ActionEvent e) {
go(); // 启动计数器
}
}
class OnOffL implements ActionListener {
public void actionPerformed(ActionEvent e) {
runFlag = !runFlag; // 切换计数器状态
}
}
public static void main(String[] args) {
Counter1 applet = new Counter1();
Frame aFrame = new Frame("Counter1");
aFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
```
#### 五、代码解析
1. **主程序结构**:该程序主要由`Counter1`类构成,继承自`Applet`,包含了计数器的逻辑和用户界面。
2. **线程管理**:通过调用`Thread.currentThread().sleep()`方法使当前线程休眠指定时间,实现定时更新计数器的功能。
3. **事件监听**:
- `StartL`类实现了`ActionListener`接口,当点击“Start”按钮时启动计数器。
- `OnOffL`类同样实现了`ActionListener`接口,当点击“Toggle”按钮时切换计数器的开启或关闭状态。
4. **主函数**:`main`方法用于启动应用程序,创建窗口并显示计数器界面。
#### 六、总结
多线程编程是现代软件开发的重要组成部分,它提高了程序的响应性和性能。通过上述示例可以看出,多线程的实现并不复杂,但需要注意线程间的同步和通信问题,避免出现数据竞争等并发问题。此外,还需要合理设计程序结构,确保线程安全,从而发挥多线程的优势。