线程的创建和使用(一)

news2024/11/25 20:39:55

1、线程

1.1、线程的概念

一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行着多份代码.

1.2、创建线程

方法一:继承Thread类


public class Exe_01 {
    public static void main(String[] args) {
        //实例化线程对象
        MyThread01 myThread01=new MyThread01();
        //运行这个线程
        myThread01.start();
    }
}

//通过继承Thread类的方式来创建一个线程
class MyThread01 extends Thread{
    @Override
    public void run() {
        System.out.println("Hello 鸡你太美!!");
    }
}

运行结果:

 

 观察线程调度:


public class Exe_02 {
    public static void main(String[] args) {
        //实例化线程对象
        MyThread02 myThread02=new MyThread02();
        //真正去操作系统中申请线程并参与CPU调度
        myThread02.start();

        //在主线程也做一个死循环打印
        while(true){
            System.out.println("唱跳,rap,篮球");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class MyThread02 extends Thread{
    //定义线程要执行的任务
    @Override
    public void run() {
        //在一个死循环中做打印
        while(true){
            System.out.println("哎呦,你干嘛!!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

 

 方法二:实现Runnable接口


public class Exe_03 {
    //通过实现Runnable的方式创建线程
    public static void main(String[] args) {
        //实例化自定义线程类
        MyRunnable runnable=new MyRunnable();
        //通过Thread的构造方法把Runnable作为参数传入
        Thread thread=new Thread(runnable);
        //启动线程才是真正意义上的创建系统线程,参与CPU调度
        thread.start();
    }
}

//实现Runnable接口
class MyRunnable implements Runnable{
    //定义线程要执行的任务
    @Override
    public void run() {
        while(true){
            System.out.println("年轻人,耗子为汁+1");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

 

由我来给大家利用线程制作一个蔡徐坤经典名场面


public class Exe_04 {
    public static void main(String[] args) {
        //练习生任务
        Runnable01 runnable01=new Runnable01();
        //第一步给大家打个招呼
        Thread t1=new Thread(runnable01);
        t1.start();

        //表演任务
        Runnable02 runnable02=new Runnable02();
        //第二步给介绍鸽鸽的特长
        Thread t2=new Thread(runnable02);
        t2.start();

        //音乐走你
        Runnable03 runnable03=new Runnable03();
        //第三步showTime
        Thread t3=new Thread(runnable03);
        t3.start();
    }
}

//创建Runnable类
//定义一个练习两年半练习生的任务
class Runnable01 implements Runnable{
    @Override
    public void run() {
        while (true) {
            System.out.println("全明星制作人们,大家好,我是一个练习时长两年半的个人练习生蔡徐坤");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//定义一个小黑子的任务
class Runnable02 implements Runnable{
    @Override
    public void run() {
        while (true) {
            System.out.println("喜欢唱、条、rap、篮球");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//点一首music送给鸽鸽
class  Runnable03 implements Runnable{
    @Override
    public void run() {
        while (true) {
            System.out.println("music");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

通过Thread类的匿名内部类的方式创建线程

/*
通过Thread类的匿名内部类的方式创建线程
 */
public class Exe_5 {
    public static void main(String[] args) {
        Thread thread=new Thread(){
            public void run(){
                while (true) {
                    System.out.println("通过创建Thread类的匿名内部类的方式创建线程");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
        thread.start();
    }
}

运行结果:

 通过创建实现了Runnable接口的匿名内部类的方式创建线程

/*
通过创建实现了Runnable接口的匿名内部类的方式创建线程
 */
public class Exe_06 {
    public static void main(String[] args) {
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                int count = 0;
                while(true) {
                    System.out.println("通过创建实现了Runnable接口的匿名内部类的方式创建线程" + count++);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        //启动线程
        thread.start();
    }
}

对比:上面两种方法

继承Thread,直接使用this就表示当前线程的引用。

实现Runnable接口,this表示的是MyRunnbale的引用,需要使用Thread类来调用

 3、通过lambda的方式创建线程


public class Exe_07 {
    public static void main(String[] args) {
        Thread thread=new Thread(()-> {
            int count=0;
            while(true){
                count++;
                System.out.println("通过lambda表达式的方式创建一个线程"+count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        //启动线程
        thread.start();
    }
}

 2、多线程的优势

多线程的优势--增加运行速度

多线程就是为了能够充分的利用CPU的资源,提升程序运行效率。

需求场景:

分别对两个变量做累加100亿次操作

一种是单线程执行,一种是两条线程并发操作。

/*多线程的优势-增加运行速度
分别对两个变量做100亿次累加操作
 */
public class Exe_08 {
    private static long count=10_0000_0000l;
    public static void main(String[] args) {
        //串行方式
        serial();
        //并行方式
        concurrency();
    }

    private static void concurrency() {
        //记录开始时间
        long begin=System.currentTimeMillis();
        //创建线程,在单个线程中执行对一个变量的累加
        Thread t1=new Thread(()->{
            long a=0l;
            for (int i = 0; i < count; i++) {
                a++;
            }
        });
        Thread t2=new Thread(()->{
            long b=0l;
            for (int i = 0; i < count; i++) {
                b++;
            }
        });
        //启动线程
        t1.start();
        t2.start();
        //等待
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //记录结束时间
        long end=System.currentTimeMillis();
        System.out.println("并行操作用时:"+(end-begin)+"ms.");
    }

    private static void serial(){
        //记录开始时间
        long begin=System.currentTimeMillis();
        long a=0l;
        //对变量进行累加
        for (int i = 0; i < count; i++) {
            a++;
        }
        long b=0l;
        for (int i = 0; i < count; i++) {
            b++;
        }
        //累加完成之后记录结束时间
        long end=System.currentTimeMillis();
        System.out.println("串行操作用时:"+(end-begin)+"ms.");
    }
}

运行结果:

结论:多线程的使用可以明显的提高程序的运行效率,充分利用CPU的资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas与pyspark计算效率对比

日常工作中&#xff0c;主要还是应用HQL和SparkSQL&#xff0c;数据量大&#xff0c;分布式计算很快&#xff1b; 本地数据处理&#xff0c;一般会使用python的pandas包&#xff0c;api丰富&#xff0c;写法比较简单&#xff0c;但只能利用单核性能跑数&#xff0c;数据量大可…

【MySQL入门】-- 数据库简单的SELECT语句详解

目录 1.SQL分类 2.注释 3.数据导入指令 4.基本的SELECT语句 5.列的别名 6.去重复行 7.显示表结构 8.一些数据库基本操作 1.SQL分类 SQL语言在功能上主要分为三大类&#xff1a; DDL(Data Defintion Language)数据定义语言&#xff1a;定义不同的数据库&#xff0c;表…

【C#】并行编程实战:任务并行性(中)

本章继续介绍任务并行性&#xff0c;因篇幅所限&#xff0c;本章为中篇。 4、取消任务 .NET Framework 提供了以下两个类来支持任务取消&#xff1a; CancellationTokenSource &#xff1a;此类负责创建取消令牌&#xff0c;并将取消请求传递给通过源创建的所有令牌。 Cancell…

关于xinput1_3.dll丢失的详细解决方法

xinput1_3.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开软件或者游戏的时候&#xff0c;电脑提示xinput1_…

8、共享模型之工具

目录 8.1 线程池2、ThreadPoolExecutor&#xff08;及其重要&#xff09;1) 线程池状态2) 构造方法3) newFixedThreadPool4) newCachedThreadPool5) newSingleThreadExecutor6) 提交任务7) 关闭线程池8) 任务调度线程池 8.1 线程池 2、ThreadPoolExecutor&#xff08;及其重要…

中国电子学会2023年05月份青少年软件编程Python等级考试试卷六级真题(含答案)

2023-05 Python六级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 明明每天坚持背英语单词&#xff0c;他建立了英语单词错题本文件“mistakes.txt”&#xff0c;将每天记错的单词增加到该文件中&…

DuiLib的编译和运行

文章目录 1、原生DuiLib的编译和运行1.1、下载并解压成这个样子1.2、打开.sln解决方案文件1.3、编译成功 2、网易DuiLib编译和运行2.1、下载并解压成这个样子2.2、打开.sln解决方案文件2.3、编译成功 3、腾讯DuiLib编译和运行vs 20173.1、下载并解压成这个样子3.2、打开.sln解决…

使用 Node.js、K8s 和分布式 SQL 构建世界上最具弹性的待办事项列表应用程序

本文演示了如何使用 Kubernetes (K8s) 和分布式 SQL 构建云原生 Node.js 应用程序。 开发可扩展且可靠的应用程序是一项热爱的工作。一个云原生系统可能包括单元测试、集成测试、构建测试&#xff0c;以及用于构建和部署应用程序的完整管道&#xff0c;只需单击一个按钮即可。 …

【计算机网络】第二章应用层-电子科技大学2023期末考试

第二章 应用层 应用层协议原理 网络应用程序体系结构 客户机/服务器体系结构&#xff1a;至少有一个服务器&#xff0c;一个客户机&#xff0c;其中服务器总是打开的&#xff0c;具有固定的众所周知的IP地址&#xff0c;主机群集常被用于创建强大的虚拟服务器&#xff0c;而客…

【Trino实战】Trino下ORC与Parquet查询性能分析

Trino下ORC与Parquet查询性能分析 环境 OS&#xff1a;CentOS 6.5 JDK&#xff1a;1.8 内存&#xff1a;256G 磁盘&#xff1a;HDD CPU&#xff1a;Dual 8-core Intel Xeon CPU (32 Hyper-Threads) E5-2630 v3 2.40GHz HDFS&#xff1a;2.9.2 Hive&#xff1a;2.3.9 T…

[n00bzCTF 2023] CPR 全

Crypto AES 给了java的加密原码&#xff0c;AES加密&#xff0c;有key import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import java.n…

arima模型原理及实战

目录 1&#xff0c;概念 2&#xff0c;数学知识 3&#xff0c;前提条件 4&#xff0c;序列不平稳时的平稳性方法 5&#xff0c;模型定阶&#xff0c;确定P和Q 6&#xff0c;模型训练与检验 1&#xff0c;概念 ARIMA模型&#xff08;英语&#xff1a;Autoregressive Integr…

grep及文本处理命令

正则表达式 一.基础命令 1.grep命令 对文本的内容进行过滤&#xff0c;针对行处理 1.1grep格式 grep [选项]…查找条件 目标文件 1.2grep命令选项 -m数字——————匹配几次后停止eg&#xff1a;grep -m 1 root /etc/passwd————————————多个匹配只取 -v …

【编程语言 · C语言 · 递归函数】

递归函数 C 语言的函数都支持递归, 也就是说&#xff0c;每个函数都可以直接或者间接第调用自己。所谓的间接调用&#xff0c;是指在递归函数调用的下层函数中再调用自己。 递归关系图如下&#xff1a; 递归之所以能实现&#xff0c;是因为函数的每个执行过程在栈中都有自己的…

深入理解 SpringBoot 日志框架:从入门到高级应用——(三)Logback 输出日志到 MySQL 数据库

文章目录 添加依赖导入 SQL 文件配置 logback-spring.xml运行结果 Logback 是一个开源的日志框架&#xff0c;它支持多种日志输出方式&#xff0c;包括控制台输出、文件输出、邮件输出等。如果要将 Logback 输出的日志保存到 MySQL 数据库中&#xff0c;可以按照以下步骤进行配…

Tapd在研发团队中的使用技巧-持续更新ing

1.TAPD第三方服务集成能力&#xff0c;支持与代码仓库、流水线进行了深度打通&#xff0c;力求为开发团队提供流畅高效的使用体验。我们梳理了一份攻略&#xff0c;掌握下面几个小技能&#xff0c;让TAPD与代码仓库、流水线一起&#xff0c;成为研发团队的得力助手&#xff0c;…

数据结构算法刷题(27)回溯(子集型)

回溯思想&#xff1a; 思路&#xff1a;这种出现全部xx组合的&#xff0c;基本都是回溯算法。首先&#xff0c;当digits是空&#xff0c;那返回也是空。当回溯到边界条件的时候&#xff0c;就更新答案&#xff0c;在非边界条件的时候&#xff0c;循环该数值下的全部情况。 cla…

125760-33-0,Fmoc-Thr(Ac4Galβ1-3Ac2GalNAcα)-OH,于蛋白质糖基化修饰

文章关键词&#xff1a;糖化学试剂&#xff0c;化学试剂&#xff0c;糖基氨基酸一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; Fmoc-Thr(Ac4Galβ1-3Ac2GalNAcα)-OH中蛋白质糖基化修饰是在糖基转移酶的催化作用下糖链分子…

色环电阻介绍

复习一下色环电阻&#xff0c;是在电阻封装上(即电阻表面)涂上一定颜色的色环&#xff0c;来代表这个电阻的阻值。色环实际上是早期为了帮助人们分辨不同阻值而设定的标准。色环电阻现在应用还是很广泛的&#xff0c;如家用电器、电子仪表、电子设备中常常可以见到。但由于色环…

Java内存模型(JMM)和volatile原理

一、Java 内存模型 JMM即Java Memory Model&#xff0c;他定义了主存&#xff08;共享的数据&#xff09;、工作内存&#xff08;私有的数据&#xff09;抽象概念&#xff0c;底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等 JMM体现以下几个方面 原子性-保证指令不会受…