认识线程
什么是线程
线程是操作系统能够进行运算调度的最小单。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
为什么要有线程
每个进程都有自己的地址空间,即进程空间。 一个服务器通常需要接收大量并发请求,为每一个请求都创建一个进程系统开销大、请求响应效率低,因此操作系统引进线程。
多线程实现并发编程比多进程更加轻量。
- 线程创建比进程创建更快。
- 线程销毁比进程销毁更快。
- 调度线程比调度进程更快。
进程与线程的区别
- 进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
- 进程和进程之间不共享内存空间。 同一个进程的线程之间共享同一个内存空间。
- 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
- 每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。
同一进程中的多个线程有各自的调用栈,自己的寄存器环境,自己的线程本地存储。
第一个多线程程序
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线程"); } }
推荐第五种写法