Java多线程基础

多线程重要吗?

java中的多线程/高并发机制,是一个IT从业者(有关java)未来收入上限

但这部分也是java中最难,涉及到的知识点最多的地方,它融合了数据结构与操作系统,甚至计算机组成原理等方面的知识。


以下仅是关于多线程的入门基础,会持续更新

文章目录

  1. 线程与进程
  2. 线程的相关概念
  3. 创建线程的两种方式
  4. 对一个线程案例的详细分析
  5. 关于启动线程的start()方法解读

1、进程与线程

进程:正在运行的程序

          是程序一次执行过程,或是正在运行的一个程序。是动态过程,有它自身的产生,存在和消亡的过程。

线程:

  • 线程是由进程创建的,是进程的一个实体

  • 一个进程可以有多个线程

二、线程的相关概念

单线程:  同一时刻,只允许执行一个线程

多线程:  同一时刻,可以执行多个线程

并发:      同一时刻,多个任务交替进行,造成一种“貌似同时”的错觉,简单来说,单核cup实现的任务就是并发

并行:     同一时刻,多个任务同时执行,多核cpu可以实现并行。   并行里也可能出现并发

三、创建线程的两种方式

01 .继承Thread类,重写run方法  Thread类也是继承了Runable类 

02. 实现Runnable接口,重写run方法  追根溯源 都是Runnable里面的run()

(下面就是一个子线程的创建)

方式01

class  Cat extends Thread{
    int times = 0;
    @Override
    public void run() {

        while (true){
         //让线程每隔一秒,在控制台输出一次
        System.out.println("hello 线程"+(++times)+"线程名"+Thread.currentThread().getName());

        try {
            //让线程休眠一秒
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(times == 100)
        {
            break;
        }
    }}

方式02

package com.xiancheng;

/**
 * written by 刘瑞臻
 * time:2022/11/26 17:02
 */
//通过实现接口Runnable  来开发线程
public class Tread02 {
    public static void main(String[] args) {
        CAT cat = new CAT();
        //  在这里没有start方法
        //  需要创建一个thread对象  将cat对象传进去
        //  这里使用了代理模式
        Thread thread = new Thread(cat);
        thread.start();
    }
}
class CAT implements  Runnable{
    int times = 0;
    @Override
    public void run() {
        while (true)
        {
            System.out.println("喵喵喵~~"+(++times)+" 线程名称:"+Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times == 80)
                break;
        }
    }
}


四、对一个线程的详细分析

(主要是对如下两个线程的分析)

package com.xiancheng;

/**
 * written by 刘瑞臻
 * time:2022/11/26 14:39
 */
public class thread {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.start();
        for (int i = 0; i < 80; i++) {
            System.out.println("主线程"+i+Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//当一个类继承线程是  该类就可以当成线程使用
class  Cat extends Thread{
    int times = 0;
    @Override
    public void run() {

        while (true){
         //让线程每隔一秒,在控制台输出一次
        System.out.println("hello 线程"+(++times)+"线程名"+Thread.currentThread().getName());

        try {
            //让线程休眠一秒
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(times == 100)
        {
            break;
        }
    }}
}

当执行main方法时,相当于创建了一个进程   相应的main线程也会相应的启动

如果此时再加入一个线程  两个线程交替执行

代码运行结果:   可以看到两个线程的关系 并不是我们理解的那样同时执行,是交替着执行的

    可以在这里输入 Jconsole连接监视器   查看进程具体情况

在这里我们又发现了一个有趣的现象:

在这里我们可以观察到,当主线程结束的时候  并不意味着整个线程的结束  更不是进程的结束

在主线程中可以开子线程     在子线程中也可以继续开子线程


五、关于启动线程的start()方法解读

只有用start()方法才能启动子线程,如果直接调run()方法,其实还是相当于在主线程执行方法,执行完之后才向下执行,在此期间并不会真正的开启子线程

Start方法详细解读: 

这个方法主要执行的是star0方法  真正是实现多线程的效果其实是start0方法

而这个方法底层是native类型的方法   是由JVM虚拟机实现的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值