Back End

java线程相关内容

PineappleCat · 3月23日 · 2021年 390次已读

1.什么是线程和进程

进程:正在运行的程序,操作系统支持多进程,PID:进程ID

线程

  • 进程中一条执行路径,也是CPU的基本调度单位
  • 进程由多个线程组成,彼此间完成不同的工作,交替执行,称为多线程

如迅雷是一个进程,下载多个任务是多个线程

java虚拟机会自动创建一个主线程,主线程执行main方法

区别

  • 进程是操作系统分配资源的基本单位,而线程是CPU的基本调度单位
  • 一个程序运行后至少一个进程
  • 一个进程可以包含多个线程,但是至少需要一个线程
  • 进程间不能共享数据段地址,但同进程的线程之间可以

2.线程的组成

  • CPU时间片:操作系统会为每个线程分配执行时间
  • 运行数据
    • 堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象。
    • 存储线程需使用的局部变量,每个线程都拥有独立的栈。
    • 线程的栈与main方法的栈是各自独立的。
  • 线程的逻辑代码

执行特点

  • 抢占式执行
    • 效率高
    • 可防止单一线程长时间独占CPU
  • 在单核CPU中,宏观上同时执行,微观上顺序执行
  • 在多核CPU中,每个核都可以独立执行一个线程,真正的并发执行

3.创建多线程的方式

3.1 继承Thread类,重写run()方法

启动线程,使用start方法,不能直接调用start方法

//1.继承Thread,重写run方法
public class MyThread extends Thread{
    //4.设置线程名通过构造方法
    public MyThread(String name){
        //调用父类的构造方法
        super(name);
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            //2.获取线程ID和名称
            //两种方式
            //方式一:this.getId() 获取线程ID this.getName() 获取线程名字
            System.out.println(this.getId()+"。。。"+this.getName()+"。。。"+i);
            //方式二:使用Thread.currentThread() 获取当前线程(推荐,灵活性高,不一定要继承Thread类)
            System.out.println(Thread.currentThread().getId()+"。。。"+Thread.currentThread().getName()+"。。。"+i);
        }
    }
}

class TestMyThread{
    //java虚拟机会自动创建一个主线程,主线程执行main方法
    public static void main(String[] args) throws InterruptedException {
        //创建子线程对象
        MyThread thread = new MyThread("t1");
        //3.设置线程的名称 -> 4进行简化
        //thread.setName("t1");
        MyThread thread2 = new MyThread("t2");
        //thread2.setName("t2");
        //启动线程,使用start方法,不能直接调用start方法
        thread.start();
        thread2.start();
        //在mian主线程中
        for (int i = 0; i < 100; i++) {
            System.out.println("主线程"+i);
        }
    }
}

案例:买卖票

//实现卖票功能
public class TicketWin extends Thread {
    public TicketWin(String name) {
        super(name);
    }
    private int ticket  = 100;

    @Override
    public void run() {
        while (true) {
            if (ticket <= 0) {
                break;
            }
            System.out.println(Thread.currentThread().getName()+"买了第"+ticket+"张");
            ticket--;
        }
    }
}

//测试类
class TestTicket{
    public static void main(String[] args) {
        TicketWin t1 = new TicketWin("t1");
        TicketWin t2 = new TicketWin("t2");
        TicketWin t3 = new TicketWin("t3");
        TicketWin t4 = new TicketWin("t4");

        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

内存图:


付费资源您未登录,请先

Click here to view the copyright notice of this site(点击此处查看本站版权声明)
0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!