JavaWeb——多线程的五种创建方法(继承Thread类、匿名内部类、Runnable接口、匿名内部类重写runnable、lambda表达式),Thread类的常见构造方法、属性

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

线程创建

一个进程包含一个主线程main,如果要新建线程就需要,使用线程中的start()方法,此时内核中出现了一个pcb对象,这个pcb就会让cpu执行对应的代码,

继承Thread类

创建线程需要使用Thread 类,来创建一个Thread 的实例,另一方面还需要给这个线程指定,要执行哪些指令/代码,指定指令的方式有很多种方式,此处先用种简单的,直接继承 Thread 类,重写Thread类中的run方法.

public class Create {
    static class MyThread extends Thread{
        @Override
        public void run() {
            System.out.println("我是一个线程");
            while (true){
            }
        }
    }
    //创建线程需要使用Thread 类,来创建一个Thread 的实例,
    //另一方面还需要给这个线程指定,要执行哪些指令/代码.
    //指定指令的方式有很多种方式,此处先用种简单的,直接继承 Thread 类,
    //重写Thread类中的run方法.
    public static void main(String[] args) {
        //当Thread对象创建出来的时候内核中并没有随之产生一个线程
        MyThread myThread = new MyThread();
        //执行了start()方法才会创建一个新线程,此时内核中出现了一个pcb
        //这个pcb就会让cpu执行对应的代码,例如上面的run方法
        myThread.start();
        while (true){
        }
    }
}

在这里插入图片描述

通过匿名内部类方式继承Thread类

在这里插入图片描述

public class Create1 {
    //匿名内部类
    //创建了一个没有名字的类,只知道这类继承自Thread{}中是这个类的具体代码
    //同时也会new出这个类的实例
    Thread t = new Thread() {
        @Override
        public void run() {
            System.out.println("我是一个线程");
            while (true){
            }
        }

    };
    public static void main(String[] args) {
        //当Thread对象创建出来的时候内核中并没有随之产生一个线程
        Create1 create1 = new Create1();
        create1.t.start();
        //执行了start()方法才会创建一个新线程,此时内核中出现了一个pcb
        //这个pcb就会让cpu执行对应的代码,例如上面的run方法
        while (true){

        }
    }
}

显式创建一个类实现Runnable接口,然后把这个Runnable的实例关联到Thread实例上

在这里插入图片描述

public class Create2 {
    //显示创建一个类实现Runnable接口
    //然后把这个Runnable的实例关联到Thread实例上
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println("我是一个新线程");
        }
    }

    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();
    }

}

使用匿名内部类去重写runnable里的run方法来创建线程

在这里插入图片描述


public class Create3 {
        public static void main(String[] args) {
            //通过匿名内部类实现Runnable接口
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是一个新线程");
                }
            };
            Thread t = new Thread(runnable);
            t.start();
        }

    }


使用lambda表达式

在这里插入图片描述

public class Create4 {
    public static void main(String[] args) {
        //使用lambda表达式来指定线程执行的内容
        Thread t = new Thread(()-> {
            System.out.println("我是一个新线程");
        });
        t.start();
    }
}

操作系统
都一样
在细节上有点区别.
通过Runnable / lambda的方式来创建线程和继承Thread类相比,代码耦合性要更小一些在写Runnable或者lambda的时候run中没有涉及到任何的Thread相关的内容.
这就意味着很容易把这个逻辑从多线程中剥离出来,去搭配其他的并发编程的方式来执行.当然也可以很容易改成不并发的方式执行.

使用Callable/Future/FutureTask创建线程

  • FutureTask是继承于Future的 所以使用FutureTask和Callable可以创建一个带返回值得多线程结果
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Demo5 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建一个线程,计算1-1000的和

        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int ret = 0;
                for (int i = 0; i <=1000 ; i++) {
                    ret+=i;
                }
                return ret;
            }
        };

        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();


        //get方法堵塞,直到前面的call方法算完,才会返回
        Integer result = futureTask.get();
        System.out.println(result);


    }
}

500500

start和run方法

start()
是要创建一个新的线程,由新的线程来执行输出.
run()
只是一个普通的方法调用.没有创建新的线程.输出语句是在原线程中执行的.

查看线程

在这里插入图片描述
选择本地连接,选刚刚创建的类,之后连接,因为是本地的,不与其他的进行交互所以后面选不安全连接。
在这里插入图片描述
之后就可以进行查看
在这里插入图片描述

Thead常见构造方法

在这里插入图片描述

Thread 的几个常见属性

在这里插入图片描述
ID 是线程的唯一标识,不同线程不会重复
名称是各种调试工具用到
状态表示线程当前所处的一个情况
优先级高的线程理论上来说更容易被调度到
关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
是否存活,即简单的理解,为 run 方法是否运行结束了

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread("hh"){
            @Override
            public void run() {
                for (int i = 0; i < 10 ; i++) {
                    System.out.println(Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //run方法的执行过程就代表着系统内线程的生命周期
                //run方法执行中,内核的线程就存在
                //run方法执行完毕,内核中的线程随之销毁
                System.out.println("线程退出");
            }
        };
        //只要线程创建完毕,属性不变
        System.out.println(t.getName());
        System.out.println(t.getPriority());
        System.out.println(t.isDaemon());
        System.out.println(t.getId());
        //会随着线程的运行过程发生变化
        System.out.println();
        System.out.println(t.isAlive());
        System.out.println(t.isInterrupted());
        System.out.println(t.getState());

        t.start();
        while (t.isAlive()){
            System.out.println("hh 正在运行");
            System.out.println(t.getState());
            System.out.println(t.isInterrupted());
            Thread.sleep(300);

        }
    }
}

在这里插入图片描述

JavaWeb 基础知识(二)——线程01 文章目录JavaWeb 基础知识(二)多线程01一、认识线程0.线程的引入1.线程的概念 JavaWeb 基础知识(二)多线程01 上节回顾   我们在介绍本节内容之前,先来简单复习一下上一节进程的相关内容 一、认识线程 0.线程的引入   引进进程的目的,就是为了能够"并发编程"   虽然多进程已经能够解决并发的问题了,但是我们认为,还不够理想。 创建进程、销毁进程、调度进程开销有点大了 进程时系统资源分配的基本单位 创建进程,就需要分配资源 销毁进程,就需要释放资源   于是 阅读详情

相关推荐

多线程(1) (进程和线程 多线程编程 创建线程 实现Runnable 匿名内部类继承Thread,Runable Lambda表达式 构造方法属性 中断线程 等待,获取,休眠线程 )

是否是守护线程,是否是"后台线程",前台线程会阻止进程结束,前台线程的工作没做完,进程是不能结束的.后台线程不会阻止进程结束,后台线程的工作没做完,进程是可以结束的.代码里手动创建线程默认都是前台的.包括main默认也是前台的.其他的JVM自带的线程都是后台线程,是后台线程就是守护线程.线程是解决并发编程的前提下,让创建,销毁,调度的速度更快点,它是一个"轻量级进程".线程"轻"的原因是:它把申请资源/释放资源的操作给省下了.多进程是再调用一些新的空间和成本,多线程可以做到公用资源.此时代码改动比较小.

m0_68800221的博客 1444

java thread 匿名_Java 匿名内部类

语法匿名内部类适合那种只需要使用一次的创建匿名的同时会立即创建一个该的实例,这个不能重复使用。new interface|superClass(){//匿名内部类}可见,匿名必须继承一个父或一个接口,且最多一个。还要注意,匿名内部类不能定义静态初始化代码块,不能在匿名里面定义接口,不能在匿名中定义构造函数。匿名就是一个继承的子,也可以多重匿名(多重子)。常用匿名写法注意辨...

weixin_34856444的博客 1626

JavaWeb 服务启动时,在后台启动加载一个线程

JavaWeb 服务启动时,在后台启动加载一个线程。 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet。 下面对这两种方法做一简单的介绍,(Mark一下,防止以后急用又忘记了): 监听(Listener) 首先,我们创建一个监听的继承ServletContextListener,如下: package com.wxp.

Champion.Wong 的专栏 3万+

创建线程的5种方式(匿名内部类lambda表达式版)

创建线程的5种方式(匿名内部类lambda表达式版)

qq_18841277的博客 1952

JavaWeb笔记03:多线程创建构造方法属性

多线程的使用 t.start 将线程放到就绪队列中,当线程被分配到CPU资源时,才会运行起来。 该线程被调度下来的5中情况: 1:被高优先级抢占 2:执行结束 3:等待IO 4:主动放弃 5:时间片耗尽了 public class Main { private static class A extends Thread { @Override public...

长不大的大灰狼 356

Java Web 实战 02 - 多线程基础篇(1)

讲述了创建多线程方法 , 多线程的好处以及使用场景

m0_53117341的博客 802

Java中有哪几种方式来创建线程执行任务

Java中常用的常见线程的几种方式

Alessio001的博客 897

javaweb-等待与唤醒案例、线程池、Lambda表达式-013

day07_等待与唤醒案例、线程池、Lambda表达式 02_线程间通信 就是一群人合作做事,彼此通信分工,有条不紊 wait之后失去了cpu,会失去资源吗?已经获得的锁没有了?wait->wait set wating notify ready queue 用sleep则不会释放 用wait则释放 因此唤醒后不能立刻调度,还需要竞争锁与cpu 等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下: wait:线程不再活动,不再参与调度,进入 wait set 中

lidashent的博客 385

Java多线程还不会的进来吧,为你量身打造

在实际应用中,多线程非常有用。例如,一个浏览器可以同时下载几幅图片,一个WEB浏览器需要同时服务来自客户端的请求,我们的电脑管家也可以一边杀毒一边清理垃圾再一边进行电脑体检等任务,这些都是多线程的应用场景。 ### 1.1.1 程序的并行 程序的并行指的是多个应用程序**真正意义上的同时执行**,CPU分配多个执行单元共同执行这些任务,效率高,但这依赖于CPU的硬件支持,需要CPU多核

緑水長流*z 1987

Javaweb---线程(1)

开篇: 关于进程线程的小理解: 进程:就像是一个大车间 要完成的一项任务 线程:就是车间的流水线,多个流水线去完成这一项任务. 1.线程包含于进程内 2.一个进程中可能有多个线程 3.线程有自己的指令 线程线程之间是独立的 4.同一个进程中的许多线程的资源是共享的(内存资源 文件) 不共享的资源 : 栈 上下文 状态 优先级 记账信息 线程:操作系统进行调度和执行的最小单位 操作系统管理进程的方式: 先描述:用PCB描述 内核只认PCB 一个线程–>一个PCB 一个进程–>多个PCB 再组织:

zsn99205的博客 273

JAVA】基础学习

介绍了Java开发的基础知识,包括开发版本、学习流程、Java基础概念、数据型、运算符、流程控制、数组、面向对象、构造函数、方法重载、封装和static关键字等内容

weixin_44899940的博客 429

周总结

从这周,我们开始接触多线程多线程的有点可以提高资源利用率,但是缺点是降低了其他线程的执行效率,用户在体验时可能会有卡顿现象,增加了系统的压力,存在共享问题和线程安全问题。创建自定义线程的方式有两种,一种是继承Thread重写run方法,第二种是遵从Runable接口,借助Thread对象和strat方法,开启线程。 当synchronized 作为关键字来修饰方法,修饰的方法就是对应的同...

sjn2212297386的博客 143

java学习~线程、注解反射、Swagger

这几天一直在学习java基础,所以跟着老师一起学习做的总结。 项目地址:StudyJava项目地址 一:线程学习 这是代码的布局以及对各个的描述和总结。可以借鉴。 线程代码地址:thread No1_thread—— 线程的五大状态: Thread.state NEW创建状态,就绪状态,RUNNABLE运行状态,(BLOCKED,WAITING,TIME_WAITING)阻塞状态,TERMINATED死亡状态

qq_42145057的博客 392

学习笔记:Java 并发编程①_基础知识入门

本博客主要介绍进程和线程的基本概念,Java线程中(基本操作,一一些主要的 api,线程状态,相关的应用和原理,两阶段终止模式。)

做笔记,记录学习中遇到的问题。 863

LangGraph智能工作流:可中断、可回溯的生产级LLM流程引擎

智能工作流是大模型落地企业系统的核心范式,其本质是将非确定性LLM调用与确定性业务逻辑通过状态驱动的方式协同编排。LangGraph基于有向图模型重构执行语义,实现带状态的节点调度、条件分支、循环控制与人工干预能力,显著提升流程韧性与可观测性。相比传统线性链式框架(如LangChain Chain),它支持运行时中断、断点续跑与跨节点状态共享,天然适配客服意图识别、合同审查、退款处理等需审计、可回滚的关键场景。OpenAI官方推荐的stateful、cyclic、resilient特性,使其成为构建高可靠A

Dendy之Java小屋 404

笔记-使用匿名内部类创建线程的三种方法

使用匿名内部类创建线程的三种方法 话说匿名内部类是什么? 匿名:没有名字 内部:写在其他内部的 言简意赅 匿名内部类的使用,最大的作用就是为了简化代码。 内部实现格式: new 父/接口() { 重写/接口中的方法 }; /* 第一种 直接创建Thread重写他的run方法,并使用他的start()方法开启线程 */ new Thread() { @Override pu

RealrX的博客 1031

Java 多线程

Java多线程详解

ᶻᶻᶻ 枕星河的博客 1640

匿名内部类的方式实现线程创建

public class Main { public static void main(String[] args) { //第一种:匿名内部类 new Thread(){ @Override public void run() { for (int i = 0; i < ...

qq_40945282的博客 276

多线程创建,复习匿名内部类Thread的一些方法,以及lambda的变量捕捉,join用法

多线程创建,复习匿名内部类Thread的一些方法,以及lambda的变量捕捉,join用法

weixin_72953218的博客 681
上一篇: 牛客杂记——(神奇的口袋 、用两个栈实现队列)
下一篇: 被人打掉奶瓶都要写的MySQL数据库——事务及其隔离性详解(脏读、不可重复读、幻读)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值