Java多线程基础

本文详细介绍了Java多线程的基础知识,包括线程的概念、单线程与多线程的区别、并发与并行的解释,以及线程的创建、终止、常用方法和线程同步。还探讨了synchronized关键字在解决线程同步问题中的应用,以及互斥锁的原理和使用示例。
摘要由CSDN通过智能技术生成

目录

1.线程相关概念

1.1 程序(program)

1.2 进程

1.3 什么是线程

1.4 单线程和多线程

1.5 并发和并行

2. 线程的基本使用

2.1 创建线程的两种方式

2.1.1  继承Thread类创建线程

2.1.2 实现Runable接口创建线程

2.1.3 多线程执行

2.1.4 如何理解线程

3. 继承 Thread 实现 Runnable 的区别

4. 线程终止

4.1 基本说明

4.2 应用案例 

5. 线程常用方法

5.1 常用方法(1)

5.2 注意事项和细节

5.3 常用方法 (2)

5.4  yield和join案例

5.5 用户线程和守护线程

5.5.1 用户线程

5.5.2 守护线程

6.线程的生命周期

6.1 JDK中用Thread.State枚举了线程的几种状态

6.2 线程状态转换图

​6.3 查看线程状态

7. 线程的同步

7.1 问题引出

7.2 Synchronized

7.2.1 线程同步机制

7.2.2 同步具体方法-Synchronized

同步代码块

8. 分析同步原理

9. 互斥锁

9.1基本介绍

9.2 使用互斥锁来解决售票问题


1.线程相关概念

1.1 程序(program)

什么是程序:

是为了完成特定任务,用某种语言编写的一组指令的集合。简而言之,就是我们写的代码

1.2 进程

  1. 进程是指运行中的程序,每启动一个进程,操作系统就会为该进程分配内存空间。
  2. 进程是程序的一次执行过程,或是正在运行的一个程序,是动态过程:他有自身的产生、存在和消亡的过程。

1.3 什么是线程

  1. 线程由进程创建,是进程的一个实体。
  2. 一个进程可以拥有多个线程。

1.4 单线程和多线程

  • 单线程:同一个时刻,只允许执行一个线程。
  • 多线程:同一个时刻,可以执行多个线程。ps:一个QQ进程,可以同时打开多个聊天窗口;一个迅雷进程,可以同时下载多个文件。

1.5 并发和并行

  • 并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉。ps:单核cpu实现的多任务就是并发。
  • 并行:同一个时刻,多个任务同时执行。 多核cpu可以实现并行

2. 线程的基本使用

2.1 创建线程的两种方式

  • 继承Thread类,重写run方法。
  • 实现Runnable接口,重写run方法。

2.1.1  继承Thread类创建线程

package thread;

//通过类继承Thread类实现创建线程
public class Thread01 {
    public static void main(String[] args) throws InterruptedException {
        //创建Cat,可以当做线程使用
        Cat cat = new Cat();

        //启动线程,最终会执行Cat的run()方法
        cat.start();
        //当main线程启动一个子线程Thread-0,主线程不会阻塞,会继续执行
        //这时,主线程和子线程是交替执行..
        System.out.println("主线程继续执行" + Thread.currentThread().getName());
        //Thread.currentThread().getName()指当前线程的名字
        for (int i = 0; i < 50; i++) {
            System.out.println("主线程i= " + i);
            //主线程休眠
            Thread.sleep(300);
        }
    }
}

//1. Cat继承了 Thread 类, 该类就可以当做线程使用
//2. 重写 run 方法,写自己的业务代码
//3. run Thread 类 实现了 Runnable 接口的 run 方法
class Cat extends Thread {
    int times = 0;

    @Override
    //run方法是一个普通的方法,没有真正的启动一个线程,run方法执行完毕,才向下执行
    public void run() {

        while(true){
            //该线程每隔0.3秒,输出
            System.out.println("喵喵喵~~~" + (++times) + Thread.currentThread().getName() );
            //线程休眠0.3秒  1秒=1000毫秒
            try {
                Thread.sleep(300);//ctrl+alt+t快速处理异常
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(times == 50){
                break;//当times到达50,退出while,线程也就退出
            }
        }
    }
}

2.1.2 实现Runable接口创建线程

  1. java是单继承的,在某些情况下一个类可能已经继承了某个父类,这是再用继承Thread类方法来创建线程显然不可能了。
  2. 通过实现Runnable接口来创建线程,可以避免1.的情况。

package thread;

//通过实现Runable接口,实现创建线程
public class Thread02 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        //创建了 Thread 对象,把 dog 对象(实现了 Runnable接口),放入 Thread
        Thread thread1 = new Thread(dog);
        Thread thread2 = new Thread(dog);
        //这里不能用dog调用start()方法,
        thread1.start();
        thread2.start();
    }
}
class Dog implements Runnable{
    int count = 0;
    public void run(){
        while(true){
                System.out.println("小狗汪汪叫~~~" + ++count + Thread.currentThread().getName()) ;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            if(count == 50)
                break;
            }
        }
    }

2.1.3 多线程执行

package thread;

public class Thread03 {
    public static void main(String[] args) {
        T1 t1 = new T1();
        T2 t2 = new T2();
        Thread thread2 = new Thread(t2);
        t1.start();
        thread2.start();
    }
}
class T1 extends Thread{
    int counts = 0;

    @Override
    public void run() {
        while(true){
            System.out.println("hello,world!" + ++counts);
            try {
                Thread.sleep( 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(counts == 10)
                break;
        }
    }
}
class T2 implements Runnable{
    int counts = 0;
    @Override
    public void run() {
        while(true){
            System.out.println("hi!" + ++counts);
            try {
                Thread.sleep( 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(counts == 5)
                break;
        }
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值