基础概念释义:
进程:进程是操作系统中运行的一个任务,软件运行在进程中
线程:软件执行某项任务时,程序执行流的最小单元,也叫轻量级进程
多线程:许多线程在”同时”运行,执行软件中的不同任务
在单处理器系统中,并不存在真正的并发处理,多条线程之间,由CPU分配时间片,每个线程轮流运行.由于计算机处理速度极快,一个线程取得两次时间片的间隔往往极短,在绝大多数情况下用户并不能察觉出来.
而在多处理器系统中,理论上才存在真正的多线程并发技术,程序的多个线程可以分配给不同的处理器执行,也就是所谓的”并行运算”.但实际上,一个系统中运行的程序往往不止一个,在大部分情况下,并不能真正实现严格意义上的并发.
我们一般所讨论的多线程并发,就是指创建多个线程,交替获取CPU的时间片,实现视觉上的并发处理.
Java中创建线程有两种主要方式:
1.继承Thread类,重写run()方法,在run()方法中定义线程需要执行的任务代码.
1.1匿名内部类创建线程类 (此种方式比较常见)
//匿名内部类创建
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("使用匿名内部类Thread创建线程");
}
};
1.2直接继承Thread类,编写其子类,重写run()方法,创建线程
class MyThread extends Thread{
@Override
public void run() {
System.out.println("继承Thread类,重写run()方法");
super.run();
}
}
2.实现Runnable接口,重写其run()方法,在run()方法中定义线程需要执行的任务代码.
2.1使用Lambda表达式创建Runnable实例(语法简介高效,创建方式等效于匿名内部类,此为Java 8新特性,提供了对单方法接口的新实现方式)
Runnable runnable2 = () -> {
System.out.println("使用Lambda表达式创建Runnable接口实例");
};
2.2使用匿名内部类创建线程(此方式比较少见)
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("创建Runnable匿名内部实现类创建线程");
}
};
2.3创建Runnable接口的实现类,重写run()方法,创建线程(由于Java是单继承当子类已经继承了一个类,无法再继承Thread类时,使用此方式.)
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("继承Thread类,重写run()方法");
}
}
3.创建线程后的调用
3.1通过Thread类实现的线程,调用其start()方法即可
例如,通过匿名内部类创建线程
new Thread() {
@Override
public void run() {
System.out.println("使用匿名内部类Thread创建线程");
}
}.start();
3.2通过Runnable接口创建的线程,需要将其传递给一个Thread类实例,调用此实例的start()方法,才能真正开辟一个新的线程,如果只是调用Runnable实现类的run()方法,并不能开辟新线程,只是在当前线程中按照顺序调用run()方法中的代码而已.
例如,通过Lambda表达式,创建语法简洁的Runnable接口实例,传递给Thread实例,实现线程
new Thread(() ->{
System.out.println("使用Lambda表达式创建Runnable接口实例线程");
}).start();