一、线程
1、为什么要创建线程
在Java程序中,我们通常使用主方法来启动整个程序,但这又产生一个问题,即一个主方法只能执行一个程序。若想在主方法中运行多个程序又需要让这些程序逐个依此等待顺序执行,这样做效率会很低下,那么有没有一个能够让多个任务同时运行不受干扰呢?因此在Java中引入线程类,线程类的存在可以使得任务能够并发执行,提升效率。
2、线程的概念
线程是操作系统OS能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.
一个进程可以开启多个线程,其中有一个主线程来调用本进程中的其他线程。
我们看到的进程的切换,切换的也是不同进程的主线程
多线程可以让同一个进程同时并发处理多个任务,相当于扩展了进程的功能。
3、图解
二、线程创建
这里介绍线程的两种创建方式,分别是通过继承Tread类或是实现Runnable接口实现
1、Thread类
将需要创建线程的类继承Thread类即可
public class Test extends Thread{
//主类继承Thread类
}
接着需要重写Thread中的run方法
public class Test extends Thread{
//重写run方法,并在方法中编写所需功能
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("A" + i);
}
}
}
(这里简单写一个循环输出的方法)
public class Test extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("A" + i);
}
}
public static void main(String[] args) {
Test t = new Test();
t.start();
for (int j = 0; j < 100; j++) {
System.out.println("B" + j);
}
}
}
这里创建两个线程,一个是run方法,另一个是在主方法。主方法中有一个循环输出的方法,并且线程的初始化也将在主方法中完成。
在单线程中,所有的任务都是顺序执行的,因此运行结果都是按照顺序输出的。但线程不同,线程在调度时取决于CPU的调度机制,这说明任务在线程中都有被执行的机会,并非顺序等待执行,因此,输出结果就不会是顺序执行的结果。当结果不是顺序执行时,说明线程调度成功。
A85
A86
B74
A87
A88
A89
2、Runnable接口
和Thread类相似,通过继承Runnable接口并重写方法即可
public class Test2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("A" + i);
}
}
public static void main(String[] args) {
Test2 t2 = new Test2();
Thread thread = new Thread(t2);
thread.start();
for (int j = 0; j < 100; j++) {
System.out.println("B" + j);
}
}
}
三、线程启动
上述给出示例代码,这里着重讲解线程的启动方式。
1、继承Thread类
创建线程的类对象
public static void main(String[] args) {
Test t = new Test();
}
调用对象中的start()方法
public static void main(String[] args) {
Test t = new Test();
t.start();
}
2、继承Runnable接口
创建实现线程的对象
public static void main(String[] args) {
Test2 t2 = new Test2();
}
将实现的线程类对象 作为参数 给到Thread构造方法创建对象
public static void main(String[] args) {
Test2 t2 = new Test2();
Thread thread = new Thread(t2);
}
调用start()方法
public static void main(String[] args) {
Test2 t2 = new Test2();
Thread thread = new Thread(t2);
thread.start();
}