Java学习之走进多线程

进程和线程

1.什么进程

  • 正在运行的程序,是系统进行资源分配的基本单位
  • 目前操作系统都是支持多线程,可以同时执行多个进程,通过进程id(pid)区分
  • 单核CPU在同一个时刻,只能运行一个进程;宏观并行,微观串行

2.什么线程

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

3.进程和线程的区别

  • 1.进程是操作系统资源分配的而基本单位,而线程是cpu的基本调度单位
  • 2.一个程序运行后至少有一个进程
  • 3.一个进程可以包含多个线程,但是至少需要有个线程,否则这个进程是没有意义的
  • 4.进程间不能共享数据段地址,但同进程的线程之间可以

线程的组成和特点

1.线程的组成

  • 任何一个线程都具有基本的组成部分:
    • cpu时间片:操作系统(OS)会为每个线程分配执行时间
    • 运行数据
      • 堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象
      • 栈空间:存储线程需使用的局部变量,每个线程都拥有独立的栈
    • 线程的逻辑代码

2.线程的特点

  • 1.线程抢占式执行
    • 效率高
    • 可防止单一线程长时间独占cpu
  • 2.在单核cpu中,宏观同时执行,微观串行就是按顺序执行

线程的创建

1.继承Tread类(重写run方法)


/**
 * 线程类
 */
public class MyThread extends Thread{
   
    @Override
    public void run() {
   
        for (int i = 0; i <100 ; i++) {
   
            System.out.println("子线程-------"+i);
        }
    }
}
public class Test {
   
    public static void main(String[] args) {
   
        //创建线程对象
        MyThread myThread = new MyThread();
        //启动线程,不能调用run方法
        myThread.start();

        //主线程执行
        for (int i = 0; i <100 ; i++) {
   
            System.out.println("主线程=========="+i);
        }
    }
}

在这里插入图片描述

1.1获取和修改线程名称

  • 获取线程id和名称
    • 1.在Thread的子类中调用this.getId()或this.getName()
    • 2.使用Thread.currentThread().getId()和Thread.currentThread().getName()
  • 修改线程名称
    • 1.调用线程对象的setName()方法
    • 2.使用线程子类的构造方法赋值
  • 第一种方式获取id和名称,局限性:要继承Thread类
/**
 * 线程类
 */
public class MyThread extends Thread{
   
    @Override
    public void run() {
   
        for (int i = 0; i <1000 ; i++) {
   
            System.out.println("线程id:"+this.getId()+"线程名字:"+this.getName()+"子线程-------"+i);
        }
    }
}

  • 第二种方式获取id和名称
/**
 * 线程类
 */
public class MyThread extends Thread{
   
    @Override
    public void run() {
   
        for (int i = 0; i <1000 ; i++) {
   
//            第一种方法获取id和名称
//            System.out.println("线程id:"+this.getId()+"线程名字:"+this.getName()+"子线程-------"+i);
//            第二种方法获取id和名称
            System.out.println("线程id:"+Thread.currentThread().getId()+"线程名字:0"+Thread.currentThread().getName()+"子线程-----------"+i);
        }
    }
}

  • 修改线程名称
/**
 * 线程类
 */
public class MyThread extends Thread{
   
    public MyThread(){
   
    }
    public MyThread(String name){
   
        super(name);
    }
    @Override
    public void run() {
   
        for (int i = 0; i <1000 ; i++) {
   
//            第一种方法获取id和名称
//            System.out.println("线程id:"+this.getId()+"线程名字:"+this.getName()+"子线程-------"+i);
//            第二种方法获取id和名称
            System.out.println("线程id:"+Thread.currentThread().getId()+"线程名字:0"+Thread.currentThread().getName()+"子线程-----------"+i);
        }
    }
}

public class Test {
   
    public static void main(String[] args) {
   
        //创建线程对象
        MyThread myThread = new MyThread("我的子线程1");
        //启动线程,不能调用run方法
        myThread.start();
        MyThread myThread1 = new MyThread();
        myThread1.setName("我的子线程2");
        myThread1.start();
        //主线程执行
        for (int i = 0; i <1000 ; i++) {
   
            System.out.println("主线程=========="+i);
        }
    }
}

在这里插入图片描述

  • 四个窗口卖票案例
public class TestWin {
   
    public static void main(String[] args) {
   
        TicketWin w1 = new TicketWin("窗口1");
        w1.start();
        TicketWin w2 = new TicketWin("窗口2");
        w2.start();
        TicketWin w3 = new TicketWin("窗口3");
        w3.start();
        TicketWin w4 = new TicketWin("窗口4");
        w4.start();
    }
}
public class TicketWin extends Thread{
   
    public TicketWin(){
   
    }
    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--;
        }
    }
}

在这里插入图片描述

2.实现Runnable接口

public class MyRunnable implements Runnable{
   
    @Override
    public void run() {
   
        for (int i = 0; i <100 ; i++) {
   
            System.out.println(Thread.currentThread().getName()+".........."+i);
        }
    }
}
public class TestRunnable {
   
    public static void main(String[] args) {
   
        //1.创建MyRunnable对象,表示线程要执行的功能
        MyRunnable myRunnable = new MyRunnable();
        //2.创建线程对象
        Thread thread = new Thread(myRunnable, "我的线程1");
        //3.启动
        thread.start();

        for (int i = 0; i < 50; i++) {
   
            System.out.println("main.........."+i);
        }
    }
}

在这里插入图片描述

  • 使用匿名内部类创建
public class TestRunnable {
   
    public static void main(String[] args) {
   
//        //1.创建MyRunnable对象,表示线程要执行的功能
//        MyRunnable myRunnable = new MyRunnable();
//        //2.创建线程对象
//        Thread thread = new Thread(myRunnable, "我的线程1");
//        //3.启动
//        thread.start();
//
//        for (int i = 0; i < 50; i++) {
   
//            System.out.println("main.........."+i);
//        }
        Runnable runnable=new Runnable() {
   
            @Override
            public void run() {
   
                for (int i = 0; i <100 ; i++) {
   
                    System.out.println(Thread.currentThread().getName()+".........."+i);
                }
            }
        };
        Thread thread = new Thread(runnable, "线程1");
        thread.start();
        for (int i = 0; i < 50; i++) {
   
            S
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值