首页 > 编程语言 >Java多线程第一篇-认识多线程

Java多线程第一篇-认识多线程

时间:2024-12-19 18:30:36浏览次数:8  
标签:Java thread Thread 第一篇 线程 println new 多线程 public

文章目录

进程和线程概念

进程(process):进程是操作系统资源分配的基本单位,操作系统目前包含多个进程而每个进程中包含着单个或者多个线程,一个进程由多个PCB(线程)来表示在代码中,如果进程出错后,不会影响到其他的进程的资源分配。重量级进程。

线程(Thread):是建立在进程之中进行任务调度和执行的基本单位轻量级进程
在同一个进程内,线程在调度或者执行时如果遇到问题,可能会相互影响(线程的安全问题+线程出现异常)。
每一个线程都可以独立的区cpu区调度执行
在同一个进程的多个线程之间,共用着同一块内存空间和文件的资源(每个线程包含状态、优先级、上下文、记账信息…)。
当第一次创建线程时,只需要申请一次资源即可,然后直接服用之前已经分配给进程的资源,省去了资源分配的开销,这样效率会得到进一步提升。

如果一个进程中的线程数量过多时,效率可能无法提升,反而还会因为调度的线程过多,时调度的开销更大,反而会降低效率。

方法说明
Thread创建线程对象
Thread(Runnable)使用Runnable对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target,String name)线程可以用来分组管理,分好的组即为线程组

继承Thread 重写run方法

当重写Thread方法时,run和start都是Thread的成员属性,run描述了线程的入口(线程要做的事情)start才是真正的调用了系统的API,在系统中创建出了线程,让线程在调用run。

这里的sleep属于static修饰的方法,通过类名进行调用

class MyThread extends Thread{
    @Override
    public void run() {
        //这是线程的入口
        while (true) {
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();//创建线程实例
        myThread.start();//进入线程
        
        //这是主线程
        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}


实现Runnable 重写run方法(解耦合)

通过MyRunnable 来实现Runnable方法来重写run方法,通过在main方法中实例化MyRunnable 来作为参数传给Thread,然后通过start调用API,然后通过线程调用run方法.

class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class Demo2 {
    public static void main(String[] args) {
        Runnable runnable=new MyRunnable();
        Thread t=new Thread(runnable);
        t.start();

        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

通过匿名内部类

  • 无参构造重写run方法
package Thread;
public class Demo3 {
    public static void main(String[] args) {
        Thread thread=new Thread(){
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
        thread.start();

        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

  • 通过生成一个new Runnable来重写run方法
public class Demo4 {
    public static void main(String[] args) {
        Thread t=new Thread(new MyRunnable(){
            @Override
            public void run() {
                while (true) {
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        t.start();

        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

lambda表达式

lamabda是一个匿名函数(执行一次就消失),主要用来实现“回调函数”的效果
回调函数:不是自身主动调用的,也不是现在就立即调用,而是将调用的机会交给操作系统,库,框架,别人写的代码。
而lambda的本质本质是一个函数氏接口(本身还是没有脱离类)。

package Thread;

public class Demo5 {
    public static void main(String[] args) {
        Thread t=new Thread(()->{
           while(true){
               System.out.println("hello thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
           }
        },"new Thread");//定义的名字,通过java
        t.start();
        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

在创建线程的时候,可以指定name来进行调试方便区分
在这里插入图片描述在这里插入图片描述
这里的主线程的入口方法如果结束,则主线程销毁,只要代码执行完,则主线程销毁,参考下⬇️
在这里插入图片描述
在这里插入图片描述

线程的常见的属性(方法)

属性获取方法
IDgetId()
名称get Name()
状态getState()
优先级getPriority()
是否后台线程(默认为false)isDaemon()
是否存活isAlive()
是否被终端isInterrupted()

Id(getId)

线程的身份标识,类似于PID,标记一个进程中唯一的线程,是java提供的id,而不是API或者PCB提供的id。

名称(get Name)

获取在调试中方便观察的线程对象。

是否后台线程(isDaemon)

前台线程和后台线程(守护线程)默认为前台线程
在java进程中,前台线程中没有执行结束此时整个进程一定不结束。
相比之下,后台进程不结束,则不影响整个进程的结束。
在这里插入图片描述

public class Demo6 {
    public static void main(String[] args) {
        Thread thread=new Thread(()->{
            while(true) {
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        //设置thread为后台线程
        thread.setDaemon(true);

        thread.start();
    }
}

是否存活(isAlive)

查看线程是否存活,以boolean为类型

    public static void main(String[] args) {
        Thread thread=new Thread(()->{
            System.out.println("线程开始");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("线程结束");
        });

        System.out.println(thread.isAlive());
        thread.start();
        //线程并发执行,并发调度的顺序不确定,取决于系统的调度器,因为调用start的时候,新线程的创建是需要开销时间的,当在创建过程中,大概率可能就会先打印第二个Alive。
        System.out.println(thread.isAlive());

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(thread.isAlive());
    }
}

在这里插入图片描述


标签:Java,thread,Thread,第一篇,线程,println,new,多线程,public
From: https://blog.csdn.net/weixin_60489641/article/details/144403284

相关文章

  • java集合-Map HashMap 源码解析
    hashMap简介HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。has......
  • Java内卷加剧,死磕八股还有用吗?
    最近小伙伴在我后台留言是这样的:现在就这光景,不比以前,会个CRUD就有人要,即使大部分公司依然只需要做CRUD的事情......现在去面试,只会CRUD还要被吐槽:面试造火箭,工作拧螺丝,就是现在互联网最真实的写照。很多程序员都是死磕八股文,以应对面试。这种情况无可厚非,但其实最重要......
  • 一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?
    一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通能力强等等”。上面这些都很对,这些......
  • spring boot使用Jwt令牌时出现 java.lang.NoClassDefFoundError: javax/xml/bind/Data
    问题根源    在Java9及更高版本中,Java平台经历了模块化系统(Jigsaw项目)的重大变化。作为这一变化的一部分,某些API被移出了默认的JDK发行版,其中包括JAXB(JavaArchitectureforXMLBinding)API。因此,在使用这些被移除的API时,如果应用程序或库没有适当地包......
  • 前端必知必会-JavaScript HTML DOM 节点列表
    文章目录JavaScriptHTMLDOM节点列表HTMLDOMNodeList对象HTMLDOM节点列表长度HTMLCollection和NodeList之间的区别总结JavaScriptHTMLDOM节点列表HTMLDOMNodeList对象NodeList对象是从文档中提取的节点列表(集合)。NodeList对象与HTMLCollectio......
  • 前端必知必会-JavaScript 窗口 - 浏览器对象模型
    文章目录JavaScript窗口-浏览器对象模型浏览器对象模型(BOM)窗口对象窗口大小总结JavaScript窗口-浏览器对象模型浏览器对象模型(BOM)允许JavaScript与浏览器“对话”。浏览器对象模型(BOM)浏览器对象模型(BOM)没有官方标准。由于现代浏览器已经......
  • Java项目实战之Java小游戏-俄罗斯方块设计与实现(附项目源代码地址)
    该项目gitee地址:https://gitee.com/lsy_loren/loren-tetris.git一、游戏概述本游戏是一款经典的俄罗斯方块游戏,使用Java语言开发,具有图形用户界面(GUI)。玩家通过操作方块的移动、旋转和下落,使其填满一行或多行来消除得分,并随着得分的增加提升等级。游戏还具备暂停、阴影显示、本......
  • 短期面试突击攻略大全!2025最全Java面试题目合集
     这两年的面试难度确实要比往年高处很多。很多小伙伴投递了上千份简历,只有几家公司约面试。排除个人简历的因素,这在往年都是不太常见的。大厂缩招,于是很多往年能进大厂的人只能去卷中小厂,搞得层层内卷。 比如往年能有一万个人能进大厂,今年大厂只招聘一千个,那另外九千个在往......
  • 多线程----互斥
    以下是关于多线程中互斥相关的详细知识点介绍以及C语言代码示例:一、互斥的概念与重要性在多线程编程中,多个线程可能会同时访问和操作共享资源(如全局变量、共享的数据结构等)。如果没有适当的控制机制,就可能导致数据不一致、程序逻辑错误等问题,这就是所谓的“线程安全”问题......
  • 在java的stream流中过滤vs在es中过滤
    就是你getHits,只能get到一万,一万之后的没办法在Java中进行聚合除了内存消耗大和性能瓶颈外,还有以下额外的缺点:1.数据传输瓶颈网络带宽消耗大:将大量数据从Elasticsearch中传输到Java应用会占用网络带宽。如果数据规模很大,这可能导致网络传输成为瓶颈,影响系统的整体性能......