1.什么是进程
正在运行的程序,是系统进行资源分配的基本单位
2.什么是线程
线程,又称轻量级进程(Light Weight Process)。进程中的一条执行路径,也是CPU的基本调
度单位。 一个进程由一个或多个线程组成,彼此间完成不同的工作,同时执行,称为多线程。
3.进程和线程的区别
- 进程是操作系统资源分配的基本单位,而线程是CPU的基本调度单位。
- 一个程序运行后至少有一个进程。
- 一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义的。
- 进程间不能共享数据段地址,但是同进程的线程之间可以。
4.线程的组成
- 任何一个线程都具有基本的组成部分
- CPU时间片:操作系统(OS)会为每个线程分配执行时间
- 运行数据:(堆空间、栈空间)
- 堆空间:存储线程需要的对象,多个线程可以共享堆中的数据
- 栈空间:存储线程需要使用的局部变量,每个线程都拥有独立的栈.
- 线程的逻辑代码
5.线程的特点
5.1线程抢占式执行
- 效率高
- 可防止单一线程长时间独占CPU.
5.2在单核CPU中,宏观上同时执行,微观上属性执行
6.线程的创建方式
6.1【继承Thread类,重写run方法】
6.1.1创建线程
6.1.2获取和设置线程的名称
获取线程ID和线程名称
- 在Thread的子类中调用this.getId()或this.getName()
- 使用Thread.currentThread().getId和Thread.currentThread().getName()
修改线程名称
- 调用线程对象的setName()方法
- 使用线程子类的构造方法赋值
案例:
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.getBalanc