java多线程基础

目录

一:认识线程

>概念

>创建线程

>多线程的优势

二:Thread类及常见方法

>常见api

三:线程的状态

四:线程安全(重点)

>产生线程安全的原因

>如何解决线程不安全的问题

五:多线程案例 

 >单例模式


一:认识线程

>概念

1)线程是什么?

一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行着多份代码.

java中,线程以轻量级进程的方式实现,也就具有进程的特征

  • 并发:一个CPU以时间片轮转调度的方式,依次执行多个进程
  • 并行:多个CPU在一个时间点,同时执行多个线程

线程到底是就绪态,还是运行态,是操作系统调度决定,程序是不知道的

java中常说的并发编程,其实包含多线程的并发,也有多线程的并行

2)为什么会有线程?

  • 并发编程成为刚需
  • 虽然多进程也可以并发实现,但线程比进程更加轻量

3)进程和线程的区别

  1. 进程包含线程,每个进程至少包含一个线程
  2. 进程是系统分配资源的最小单位,线程是系统调度的最小单位
  3. 进程状态的改变耗费更多时间,线程的效率更高
  4. 进程占用独立的虚拟地址空间,同一个进程内的线程可以共享这个进程的内存。 一个进程要访问另一个数据,需要使用通信的方式(代价大),同一个进程的线程可以直接使用共享变量。 一个进程挂掉,不会影响其他进程,一个进程中的线程挂掉,可能会影响整个进程挂掉

4)JAVA的线程和操作系统线程的关系

Java中的线程,是以轻量级进程来实现的JAVA,标准库里的Thread类可以视为是对操作系统提供api进行进一步的抽象和封装

>创建线程

①new Thread(此时还没有创建系统中的线程)

public class 继承Thread类 {
    public static void main(String[] args) {
        //1.静态内部类,和普通类没有啥区别
        Thread t = new MyThread();
        //调用start方法,才会真正的创建操作系统中的线程,并申请系统调度执行
        t.start();
        
        //2.匿名内部类:new出来的其实是一个没有类名的匿名类(继承了Thread)
        Thread t2 = new Thread(){
            @Override
            public void run() {
                System.out.println("匿名内部类 run");
            }
        };
        t2.start();
    }

    private static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("这里是线程运行的代码");
        }
    }
}

②实现Runnable接口

public class Runnable接口 {
    public static void main(String[] args) {
        //1.先创建一个Runnable对象,传入Thread的构造方法
        Thread t = new Thread(new MyRunnable());
        t.start();

        //2.Runnable也可以使用匿名内部类的写法
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable匿名内部类 run");
            }
        });
        t2.start();

        //3.Runnable lambda的写法
        Thread t3 = new Thread(() -> {
            System.out.println("Runnable匿名内部类 run");
        });
        t3.start();//t3
    }

    //Runnable接口,表示定义线程的任务对象(Thread才是线程本身)
    private static class MyRunnable implements Runnable{
        @Override
        public void run() {//线程要执行的任务代码
            System.out.println("my runnable run");
        }
    }
}

创建线程的方式:

1.继承Thread,重写run

2.实现Runnable接口,重写run

3.实现Callable接口(后面讲述)

>多线程的优势

(1)多线程可以并行的执行,提高计算机执行效率。  在计算机中提高程序的执行效率有三种方法:一、是增加计算机的CPU个数。二、是为一个程序启动多个进程。三、是在程序中使用多线程。因为CPU的昂贵,所以第一种不好。又因为每一个进程都是在独立的内存空间中运行,并且内存不共享,数据不共享,所以启动多进程会消耗大量系统资源,第二种不好。第三种继承了他们的优点,弥补了他们的缺点,并且多线程可以模拟多块CPU的运行方式,因此多线程是提高程序执行效率的最廉价方式。

(2)充分利用CPU资源。 因为我们的电脑都是只有一个CPU,所以充分利用CPU资源显得尤为重要。当执行单线程程序时,在程序发生阻塞的时候CPU可能处于空闲状态,这样就造成了计算机资源的浪费。而当使用多线程的时候可以在一个线程发生阻塞并且CPU处于空闲的时候,可以运行其他线程,这样CPU很难有空闲的时候了,因此CPU资源就得到了充分利用。

(3)简化编程模式。如果使用多线程的话,让每一个线程处理一个单独的任务,可以只针对这个单独的任务进行编程,这样有利于开发人员对程序的理解。就是把一个大的东西分成一个一个的小东西进行处理。

二:Thread类及常见方法

Thread 类是 JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的 Thread 对象与之关 联。

利用JDK的命令:jconsole可以查看java进程的信息

>常见api

Thread有静态方法,实例方法

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值