1. 线程的概述
1.1进程
-
在一个操作系统中,每个独立执行的程序都可以称为一个进程,就是一个正在运行的程序。
-
例如在windows系统中启动任务管理器,在任务管理器面板中点击进程选项可以看到当前正在运行的程序,也就是系统所有的进程,如下图所示。
-
CPU的高并发
在多任务操作系统中,表面上看是进程并发执行的,比如可以一边看视频,一边聊天,但其实并运行不是并发运行的。所有的应用程序都是由CPU运行的,对于一个CPU而言同一时间只能运行一个程序,也就是只执行一个进程。系统会在某一段时间分配CPU执行一个程序,然后下一段时间再次随机给CPU分配一个程序。由于CPU运行速度很快,可以在极短的时间里告诉切换,所以给人感觉多个程序在并行。
1.2线程
- 在一个进程内部可以有多个执行的任务运行,这每一个任务便是进程中的一个个线程。每一个进程中都至少有一个线程。进程是拥有资源的基本单位, 线程是CPU调度的基本单位。
1.3什么是多线程
- 刚开始接触java时我们学的程序都是按照调用顺序依次往下执行的,没有两段程序交替运行的效果,这样的程序称为单线程程序。但是实际应用中我们需要多段程序代码交替运行,则需要创建多个线程,即多线程程序。即多线程是指一个进程在执行过程中产生多个单线程,这些线程在运行时相互独立,且并发执行。
1.4多线程的意义
- 多线程的作用不是提高执行速度,而是为了提高应用程序的使用率。
- 我们所有程序在运行时都是在抢CPU的时间片,1.2说过线程是CPU调度的基本单位,而哪个进程抢到CPU是随机的,所以多线程程序自然比单线程程序更容易抢到CPU,所以CPU运行多线程程序的时间更多一些,即提高了程序的使用率。
2.线程的创建
2.1继承Thread类创建多线程
-
分为以下几个步骤:
-
创建一个类(MyThread类),继承Thread类
-
在MyThread类中重写Thread类的run方法。run方法里面的代码即是线程的代码。
-
创建一个类(Teat类),在Teat类中创建MyThread类的对象。
-
在Teat类中调用start方法开启线程。(注意:不要重复开启同一个线程)
-
代码如下所示:
```
public class Test {
public static void main(String[] args) {
MyThread th = new MyThread();
th.start();
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 99; i++) {
System.out.println(i);
}
}
}
```
2.2实现Runnable接口创建多线程
-
分为以下几个步骤:
-
定义一个类(MyRunnable类),实现Runnable接口。
-
重写Runnable接口中的run方法。
-
创建一个类(Test2类),在该类中创建Runnable接口的子类对象。
-
在Teat2类中创建Thread类对象,把Runable接口的子类对象传进去
-
在Test2类中调用start方法开启线程。
代码如下所示:
``` public class Test2 { public static void main(String[] args) { MyRunable myRunable = new MyRunable(); Thread th = new Thread(myRunable); th.start(); } } public class MyRunable implements Runnable { @Override public void run() { for (int i = 0; i < 99; i++) { System.out.println(i); } } } ```
-