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

推荐第五种写法,想要了解更多并发编程内容,请看我的并发专栏

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手插口袋谁也不爱♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值