注意
以下内容源自互联网相关资料及本人学习与工作经验,仅为学习及技术分享所用,切勿用于商业用途,转载请注明出处。
1. 进程与线程
软件开发的初学者经常搞不清楚这两个概念的区别
- 进程:进程指的是拥有独立内存空间的应用程序执行过程。通俗点讲,每一个应用程序就是一个进程(或者进程树),比如您电脑上启动着的QQ、迅雷、种子搜索器等等,这些运行着的程序都是独占部分内存资源的,相互之间不影响(不会因为QQ崩溃了,您的迅雷就下不了片子)。
- 线程:在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分成多个运行区域,每个独立的小区域(小单元)称为一个线程。一个进程至少要有一个线程,由线程来具体运行进程中某个逻辑功能。比如迅雷下载任务会启动多个线程,分别下载同个下载源的不同文件片,再启动一个线程将这些文件片聚集成一个完整的文件。
- 多线程:在一个进程中,我们同时开启多个线程,让多个线程同时去完成某些任务。比如后台服务系统,就可以用多个线程同时响应多个客户的请求,起到提高运行效率的作用。
2. 多线程的运行原理
当我们的程序启动多个线程去完成一个任务时,比如启动多个线程,并发下载文件。感觉上这些线程是在同时运行的,但事实上并非如此。线程的运行是与CPU息息相关的。CPU是负责计算的电脑核心组件,也就是说只有得到CPU资源,我们的线程才能够执行。假设我们的电脑只有一个CPU,那么很明显,多线程必须去竞争这个CPU,谁得到CPU时间片,谁会可以执行,然后时间片用完,暂停执行,再次竞争,依此循环。由于CPU切换任务时间太快,肉眼无法区别,就造成了多线程同时运行的假象。
3. Java中实现线程的两种方式
3.1 继承Thread
创建一个新的类继承Thread类,重载run方法,run方法中是具体的调用逻辑。启动线程时,只需要调用new方法构建一个该线程类的对象,然后调用start方法就可以启动了。启动后的线程是独立于主线程的。代码如下:
public class MyThreadWithExtends extends Thread {
@Override
public void run() {
System.out.println("使用继承Thread方式启动线程");
}
public static void main(String[] args) {
Thread thread1 = new MyThreadWithExtends("a");
thread1.start();
}
}
注意调用Thread对象的run方法和start方法的区别:
调用run方法,则只是一个普通的方法调用,不会开启新的线程,还是运行在主线程中。
3.2 实现Runnable接口
创建一个新的类实现Runnable接口,实现run方法,启动线程时,调用new Thread(Runnable r)构建一个线程类对象,调用start方法启动。代码如下:
public class MyThreadWithImpliment implements Runnable {
@Override
public void run() {
System.out.println("使用实现Runnable方式启动线程");
}
public static void main(String[] args) {
Thread thread1 = new Thread(new MyThreadWithImpliment(), "thread-1");
// 可指定线程名为thread-1
thread1.start();
}
}