1、什么是多线程?
首先来明白一个进程概念,一个进程是指一个正在运行的应用程序,而线程就是进程的执行单元,是进程的一条执行路径。进程与线程的关系是:一个进程可以包括多条线程。所以多线程就是指一个应用程序有多条执行路径。
我们经常用的下载器,能够同时执行多个下载任务,这就是多线程,值得注意的是,经常使用的DOS窗口是单线程的,一条指令执行结束后才能执行下一条指令。
值得注意的是:CPU每次只能执行一条线程,而且线程的执行具有随机性,不能知道某一时刻哪条线程得到CPU的执行权。
2、为什么要使用多线程?
如果程序是单线程的话,运行到某一步,假如说需要请求系统资源的时候,那么就会导致程序的阻塞(暂停),CPU就会空闲出来,就会造成资源浪费。如果我们在资源空闲的时候再创建出一条或多条线程,就能够充分的利用这些资源,使得CPU每时每刻都在工作,这样就最大效率的利用了CPU。单个进程可以有多个并发执行的线程,这样比只有一条线程执行效率要大多了。打个比方,以前这些活儿一个人干,现在有好多个人干,当然比一个人做效率高。
所以说:多线程,为效率而生。
3、实现多线程的方法?
有两种。
(1)继承 Thread 线程类
步骤:
A:定义一个类继承Thread类。
B:子类要重写Thread类的run()方法(Thread类是抽象类,继承它必须重写run方法,在方法中定义本线程执行内容)。
C:启动线程。
实例:
线程类:
<span style="font-size:14px;"> //创建一个类继承Thread抽象类
public class MyThread extends Thread {
//重写run方法
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName()+ x); //getName 在底层实际是this.getName,默认加上this
}
}
}
</span>
测试类:<span style="font-size:14px;">public class ThreadDemo {
public static void main(String[] args) {
//实例化线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//为线程对象设置名字
my1.setName("岳飞");
my2.setName("金兀术");
//启动线程,注意start方法内会自动调用run方法
my1.start();
my2.start();
}
}
</span>
运行效果:当运行后,两个线程对象会争抢CPU资源,所以会争着打印自己的名字,又因为线程的随机性,所以打印出的名字没有规律性。(2)实现 Runnable 接口
步骤:
A:创建一个类实现 Runnable 接口
B:重写run()方法
C:创建类的实例
D:把类的实现作为Thread的构造参数传递,创建Thread对象
实例:
线程类:
<span style="font-size:14px;"> //定义类实现Runnable接口
public class MyRunnable implements Runnable {
//重写run方法
@Override
public void run() {
for (int x = 0; x < 100; x++) {
// Thread.currentThread()方法用于返回当前线程对象的引用
System.out.println(Thread.currentThread().getName() + x);
}
}
}</span>
测试类:
<span style="font-size:14px;">public class MyRunnableDemo {
public static void main(String[] args) {
//实例化线程对象,只需创建一个即可
MyRunnable my = new MyRunnable();
Thread t1 = new Thread(my); //这个构造方法用于将实现Runnable接口的类转化为Thread类
Thread t2 = new Thread(my);
t1.setName("岳飞");
t2.setName("金兀术");
t1.start();//启动线程
t2.start();
}
}</span>
和上边的执行效果是一样的。
比较:建议使用第二种,实现Runnable接口,因为这种方法避免了单继承的局限性(如果一个类已经有了父类,那么,它就不能再去继承Thread类)。而且,实现Runnable接口的方式只创建了一个线程类对象。
4、线程的生命周期?
线程的生命周期共分成五个阶段:
小结:多线程,为效率而生。