认识线程
什么是线程
线程是操作系统能够进行运算调度的最小单。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
为什么要有线程
每个进程都有自己的地址空间,即进程空间。 一个服务器通常需要接收大量并发请求,为每一个请求都创建一个进程系统开销大、请求响应效率低,因此操作系统引进线程。
多线程实现并发编程比多进程更加轻量。
- 线程创建比进程创建更快。
- 线程销毁比进程销毁更快。
- 调度线程比调度进程更快。
进程与线程的区别
- 进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
- 进程和进程之间不共享内存空间。 同一个进程的线程之间共享同一个内存空间。
- 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
- 每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。
同一进程中的多个线程有各自的调用栈,自己的寄存器环境,自己的线程本地存储。
第一个多线程程序
Java标准库提供了一个类Thread能够表示一个线程。
下面是创建线程的5种写法
第一种写法
继承Thread类
public class Thread1 {
public static class MyThread extends Thread{
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("新线程");
}
}
}
public static void main(String[] args) {
MyThread t=new MyThread();
t.start();
while (true){
System.out.println("Main线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
程序执行结果如下
mian方法所对应的线程与t.start方法创建的新线程可同时执行打印
看打印结果可发现线程的调度是随机的
第二种写法
实现Runnable接口
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("新线程");
}
}
public class Thread2 {
public static void main(String[] args) {
Thread t=new Thread(new MyThread());
t.start();
System.out.println("main线程");
}
}
第三种写法
使用匿名内部类创建 Thread 子类对象
public class Thread3 {
public static void main(String[] args) {
Thread t=new Thread(){
@Override
public void run() {
System.out.println("新线程");
}
};
t.start();
System.out.println("main线程");
}
}
第四种写法
匿名内部类创建 Runnable 子类对象
public class Thread4 {
public static void main(String[] args) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("新线程");
}
});
t.start();
System.out.println("main线程");
}
}
第五种写法
lambda 表达式创建 Runnable 子类对象
public class Thread5 {
public static void main(String[] args) {
Thread t = new Thread(() -> {
System.out.println("新线程");
});
t.start();
System.out.println("main线程");
}
}
推荐第五种写法