Java的高级篇--多线程

1.什么是进程

  正在运行的程序,是系统进行资源分配的基本单位

2.什么是线程

线程,又称轻量级进程(Light Weight Process)。进程中的一条执行路径,也是CPU的基本调

度单位。 一个进程由一个或多个线程组成,彼此间完成不同的工作,同时执行,称为多线程。

3.进程和线程的区别

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

4.线程的组成

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

5.线程的特点

5.1线程抢占式执行

  • 效率高
  • 可防止单一线程长时间独占CPU.

5.2在单核CPU中,宏观上同时执行,微观上属性执行

6.线程的创建方式

6.1【继承Thread类,重写run方法】

6.1.1创建线程

6.1.2获取和设置线程的名称

获取线程ID和线程名称

  1. 在Thread的子类中调用this.getId()或this.getName()
  2. 使用Thread.currentThread().getId和Thread.currentThread().getName()

 修改线程名称

  1. 调用线程对象的setName()方法
  2. 使用线程子类的构造方法赋值

案例:

public class Ticket extends Thread{

    @Override
    public void run(){
        for (int i=100;i>0;i--){
            System.out.println(Thread.currentThread().getName()+ "卖了一张票"+"剩余:"+i+"张");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Ticket t1 = new Ticket();
        t1.setName("张三");
        Ticket t2 = new Ticket();
        t2.setName("李四");
        Ticket t3 = new Ticket();
        t3.setName("王五");
        Ticket t4 = new Ticket();
        t4.setName("赵六");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

6.2【实现Runnable接口】

6.2.1创建线程

 案例:

public class Ticket implements Runnable{
    private int ticket =100;
    @Override
    public void run() {
        while (true){
                if (ticket>0){
                    ticket--;
                    System.out.println(Thread.currentThread().getName()+"卖了1张票,剩余:"+ticket+"张票");
                }else {
                    break;
                }
            }

    }
}
public class Test {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        Thread t1 = new Thread(ticket,"曹操");
        Thread t2 = new Thread(ticket,"刘备");
        Thread t3 = new Thread(ticket,"孙权");
        Thread t4 = new Thread(ticket,"司马懿");


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

package com.ykq.demo05;

/**
 * @program: qy151-java高级-多线程
 * @description:
 * @author: YSH
 * @create: 2022-07-17 12:22
 **/
public class TestBank {
    public static void main(String[] args) {
           BankCard bankCard=new BankCard(0);
           SaveMoney save=new SaveMoney(bankCard);
           TakeMoney take=new TakeMoney(bankCard);

           Thread t1=new Thread(save,"喜羊羊");
           Thread t2=new Thread(take,"美羊羊");
           t1.start();
           t2.start();
    }
}
//取钱得任务
class TakeMoney implements  Runnable{
    private BankCard card;
    public TakeMoney(BankCard card){
        this.card=card;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if(card.getBalance()>=1000) {
                card.setBalance(card.getBalance() - 1000);
                System.out.println(Thread.currentThread().getName() + "从卡中取出1000,卡中余额为:" + card.getBalance());
            }else{
                System.out.println("赶紧存钱,卡中没钱了.");
                i--;
            }
        }
    }
}
//存钱得任务
class SaveMoney implements  Runnable{
    private BankCard card;
    public SaveMoney(BankCard card){
         this.card=card;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            card.setBalance(card.getBalance()+1000);
            System.out.println(Thread.currentThread().getName()+"往卡中存入1000,卡中余额为:"+card.getBalance());
        }
    }
}

//
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值