JavaEE-什么是多线程?(一)

简介: JavaEE-什么是多线程?(一)

认识线程

什么是线程

线程是操作系统能够进行运算调度的最小单。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

为什么要有线程

每个进程都有自己的地址空间,即进程空间。 一个服务器通常需要接收大量并发请求,为每一个请求都创建一个进程系统开销大、请求响应效率低,因此操作系统引进线程。

多线程实现并发编程比多进程更加轻量

  • 线程创建比进程创建更快。
  • 线程销毁比进程销毁更快。
  • 调度线程比调度进程更快。

进程与线程的区别

  • 进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
  • 进程和进程之间不共享内存空间同一个进程的线程之间共享同一个内存空间
  • 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
  • 每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。

同一进程中的多个线程有各自的调用栈,自己的寄存器环境,自己的线程本地存储。

第一个多线程程序

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线程");
    }
}

推荐第五种写法


相关文章
|
7月前
|
存储 安全 Java
【JavaEE】线程安全
【JavaEE】线程安全
|
7月前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
7月前
|
算法 Java 编译器
【JavaEE多线程】掌握锁策略与预防死锁
【JavaEE多线程】掌握锁策略与预防死锁
68 2
|
7月前
|
设计模式 安全 Java
【JavaEE多线程】从单例模式到线程池的深入探索
【JavaEE多线程】从单例模式到线程池的深入探索
62 2
|
7月前
|
监控 安全 Java
【JavaEE多线程】深入解析Java并发工具类与应用实践
【JavaEE多线程】深入解析Java并发工具类与应用实践
93 1
|
7月前
|
安全 Java 编译器
【JavaEE多线程】线程安全、锁机制及线程间通信
【JavaEE多线程】线程安全、锁机制及线程间通信
59 1
|
7月前
|
安全 Java API
JavaEE多线程】深入理解CAS操作:无锁编程的核心
JavaEE多线程】深入理解CAS操作:无锁编程的核心
55 0
|
7月前
|
Java 程序员 调度
【JavaEE多线程】理解和管理线程生命周期
【JavaEE多线程】理解和管理线程生命周期
52 0
|
7月前
|
安全 Java 编译器
【JavaEE初阶】 线程安全
【JavaEE初阶】 线程安全
|
7月前
|
存储 设计模式 监控
【JavaEE】多线程案例-线程池
【JavaEE】多线程案例-线程池