Java基础——多线程
前言
本文总结了java多线程的比较完整系统的知识点,以及涉及到的生产者与消费者模式做了总结。
一、线程概述
1.什么是进程和线程?
- 进程是指一个内存中的运行程序。每个进程都有一块自己独立的内存空间,一个进程中可以启动一个或多个线程。
- 线程是指进程中的一个执行流程,线程是由进程创建的,它是进程的一个实体。一个进程可以创建多个线程。
- 每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,被称为线程。操作系统中的每一个进程中都至少存在一个线程。
- java中程序最少有两个线程(主线程和GC回收线程)
单线程与多线程
- 单线程:如果在main方法中没有创建其它的线程,那么当main方法执行完最后一个语句,JVM就会结束java应用程序。
- 多线程:如果在main方法中还有其它线程,那么JVM要在主线程和其它线程之间来回切换,直到等所有的线程都执行完毕才会结束java应用程序。
- 多线程的优势:
1. 减轻交互频繁,涉及面多的应用程序的困难。
2. 程序的吞吐量会得到改善。
3. 有多个处理器的系统,可以并发运行多个不同的线程。
用户线程和守护线程
- 用户线程:也叫工作线程,当线程的任务执行完后通知线程结束。
- 守护线程:一般是为工作线程服务的,当所有的工作线程结束后,守护线程自动结束。
设置一个线程为守护线程:(启动线程前先设置)
thread1.setDaemon(true);
线程结束后,守护线程自动结束。
2.什么是并行和并发?
- 并行是指在同一时间点,多个任务同时进行。多核CPU可以实现并行
- 并发是指在很小的时间段,多个任务交替进行,造成一种”貌似同时进行“的错觉。单核CPU实现的多任务就是并发。
- 并发和并行可以同时存在的,即在并行的任务中,某个或多个任务中又有多个线程运行,那几个线程就是并发的。
二、多线程的实现
1.继承Thread实现多线程
- 在java中,要想实现多线程,必须依靠线程主体类;而java.lang.Thread是java中负责操作多线程的类,只要继承Thread类,就能成为线程主体类。为满足一些其它的需求,还可通过实现Runnable接口来定义。
- 实例代码如下:
实现步骤:让该线程类继承Thread ——》 重写run() ——》启动线程的start方法
public class MyThread extends Thread{
private String name;
public MyThread(String name){
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(this.name + "在运行"+i);
}
}
}
public class Demo {
public static void main(String[] args) {
MyThread myThread1 = new MyThread("线程");
Thread thread1 = new Thread(myThread1);
Thread thread2 = new Thread(myThread1);
Thread thread3 = new Thread(myThread1);
thread1.start();
thread2.start();
thread3.start();
}
}
2.Runnable接口实现多线程
java中通常是使用Runnable接口来实现多线程,因为Java的单继承机制以及很多时候会涉及到公共的参数资源。
此时需要Runnable接口才能实现。
演示代码如下:
public class Ticket implements Runnable{
@Override
synchronized public void run() {
for (int i = 0; i < 10; i++