Java——多线程01(创建和启动,优先级调度,守护线程,出让/礼让线程,插队/插入线程)

news2024/12/28 4:02:02

目录

  • 1.多线程的创建和启动方式
    • 1.线程第一种启动方式(继承Thread类)
    • 2.多线程的第二种启动方式实现Runnable接口
    • 3.多线程的第三种启动方式实现Callable接口
  • 2.Thread多线程中的方法
    • 1.getName(), setName(),currentThread(),sleep
    • 2.Thread优先级调度方法
    • 3.守护线程
    • 4.出让线程/礼让线程
    • 5.插入线程/插队线程

多线程涵盖的基本概念:链接: 程序进程和线程(线程的并发与并行)

1.多线程的创建和启动方式

在这里插入图片描述

1.线程第一种启动方式(继承Thread类)

//Thread第一种启动方式
//1.定义一个类继承Thread类
//2.重写run方法
//3.创建子类的对象,并启动线程

package threadDemo01;


public class test01 {
    //Thread第一种启动方式
    //1.定义一个类继承Thread类
    //2.重写run方法
    //3.创建子类的对象,并启动线程
    public static void main(String[] args) {
        myThread t1=new myThread();
        myThread t2=new myThread();
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();//启动线程
        t2.start();//启动线程
    }
}

package threadDemo01;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(getName()+"jhsgdf");
        }
    }
}

在这里插入图片描述

2.多线程的第二种启动方式实现Runnable接口

/*
* 多线程的第二种启动方式Runnable
* 1.定义一个类继承Runnable接口
* 2.重写run方法
* 3.创建子类的对象
* 4.创建一个Thread类的对象,并开启线程
* */

package threadDemo02;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class test02 {
    public static void main(String[] args) {
        /*
        * 多线程的第二种启动方式Runnable
        * 1.定义一个类继承Runnable接口
        * 2.重写run方法
        * 3.创建子类的对象
        * 4.创建一个Thread类的对象,并开启线程
        * */
        //1.创建myRunnable对象
        myRunnable r1 = new myRunnable();
        myRunnable r2 = new myRunnable();

        //2.创建线程对象
        Thread t1=new Thread(r1);
        Thread t2=new Thread(r2);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();//启动线程
        t2.start();//启动线程

    }
}

package threadDemo02;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            Thread t=Thread.currentThread();
            System.out.println(t.getName()+"ksjdhg");
        }
    }
}

在这里插入图片描述

3.多线程的第三种启动方式实现Callable接口

  • 多线程的第三种启动方式:
    * 特点:可以获取到多线程运行的结果。
    * 1.创建一个类myCallable实现Callable接口
    * 2.重写call方法(有返回值)
    * 3.创建myCallable对象(表示多线程要执行的任务)
    * 4.创建FutureTask对象(作用:管理多线程运行的结果)
    * 5.创建Thread类的对象并启动。(表示线程)
package threadDemo03;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class test03 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /*
        * 多线程的第三种启动方式:
        *      特点:可以获取到多线程运行的结果。
        * 1.创建一个类myCallable实现Callable接口
        * 2.重写call方法(有返回值)
        * 3.创建myCallable对象(表示多线程要执行的任务)
        * 4.创建FutureTask对象(作用:管理多线程运行的结果)
        * 5.创建Thread类的对象并启动。(表示线程)
        * */
        //3.创建myCallable对象(表示多线程要执行的任务)
        myCallable mc = new myCallable();
        //4.创建FutureTask对象(作用:管理多线程运行的结果)
        FutureTask <Integer>ft = new FutureTask<>(mc);
        //5.创建Thread类的对象并启动。(表示线程)
        Thread t1=new Thread(ft);
        t1.start();

        //6.获取多线程运行的结果
        Integer result=ft.get();
        System.out.println("result="+result);

    }
}

package threadDemo03;

import java.util.concurrent.Callable;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum=0;
        for (int i = 0; i < 20; i++) {
            sum+=i;
        }
        return sum;
    }
}

在这里插入图片描述

2.Thread多线程中的方法

1.getName(), setName(),currentThread(),sleep

  1. getName()Theard 类中得到线程名字的方法

  2. setName设置线程的name(如果没有给线程设置名字,默认为Thread-X(从0开始))

  3. static Thread currentThread().返回当前线程的对象
    /*细节
    * 1.当JVM机启动之后,会自动启动多条线程
    * 其中有一条就叫做main线程
    * 它的作用就是调用main方法,并执行里面的代码
    * 以前我们所写的代码,其实就是运行在main线程当中。
    * */

  4. static void sleep(long time)让线程指定休眠时间,单位为毫秒
    /*细节
    * 1.哪条线程执行到这个方法,那么哪条线程就会在这里停留对应时间
    * 2.方法参数:ms,
    * 3.时间到了以后,线程继续执行下面的其他代码
    * */

package threadMethod01;
/**
 * @version 1.0
 * @auther Demo龙
 */
public class test01 {
    /*
    *
    * */
    public static void main(String[] args) throws InterruptedException {
        //创建线程对象
        myThread t1=new myThread();
        myThread t2=new myThread();
        //1.setName设置线程的name(
        //      如果没有给线程设置名字,默认为Thread-X(从0开始))
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();//启动线程
        t2.start();//启动线程

        //3.static Thread currentThread().返回当前线程的对象
            /*细节
            * 1.当JVM机启动之后,会自动启动多条线程
            *   其中有一条就叫做main线程
            *   它的作用就是调用main方法,并执行里面的代码
            * 以前我们所写的代码,其实就是运行在main线程当中。
            * */
        Thread t = Thread.currentThread();
        System.out.println("t="+t);
        System.out.println("t.getName()="+t.getName());//main

        //4.static void sleep(long time)让线程指定休眠时间,单位为毫秒
            /*细节
            * 1.哪条线程执行到这个方法,那么哪条线程就会在这里停留对应时间
            * 2.方法参数:ms,
            * 3.时间到了以后,线程继续执行下面的其他代码
            * */
        Thread.sleep(5000);//休眠5秒
        System.out.println("8888888888888888888888");

    }
}

package threadMethod01;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            //2.getName()Theard 类中得到线程名字的方法
            System.out.println(getName()+"@"+i);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

2.Thread优先级调度方法

/*抢占式调度()随机
* 1.setPriority(int newPriority) 设置线程的优先级
* 2.getPriority() 获取线程的优先级
* */

package threadMethod02;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class test02 {
    /*抢占式调度()随机
    *   1.setPriority(int newPriority)  设置线程的优先级(1-10)
    *   2.getPriority()  获取线程的优先级
    * */
    public static void main(String[] args) throws InterruptedException {
        //创建线程要执行的参数对象
        myThread02 r=new myThread02();

        //创建线程对象
        Thread t1=new Thread(r,"坦克");
        Thread t2=new Thread(r,"飞机");
        //查看默认优先级=5
        System.out.println(t1.getPriority());//5
        System.out.println(t2.getPriority());//5
        System.out.println(Thread.currentThread().getPriority());//5
        //设置默认优先级
        t1.setPriority(10);//优先级最高
        t2.setPriority(1);//优先级最低
        t1.start();
        t2.start();

    }
}

package threadMethod02;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread02 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"@"+i);
        }
    }
}

在这里插入图片描述

3.守护线程

/*
* final void setDaemon(boolean on) 设置为守护线程
* 细节:当其他的非守护线程执行完毕后,守护线程会陆续结束(不是立即)。
* */

package threadMethod03;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class test03 {
    public static void main(String[] args) throws InterruptedException {
        /*
        * final void setDaemon(boolean on) 设置为守护线程
        *     细节:当其他的非守护线程执行完毕后,守护线程会陆续结束(不是立即)。
        * */
        //创建线程对象
        myThread1 t1=new myThread1("飞机");
        myThread2 t2=new myThread2("坦克");

        //设置为守护线程
        t2.setDaemon(true);//(设置t2为备胎,其他非备胎结束了,t2也慢慢(时间不一)会结束)
        
        t1.start();
        t2.start();
    }
}

package threadMethod03;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread1 extends Thread{

    public myThread1() {
    }

    public myThread1(String name) {
        super(name);
    }

    @Override
    public void run() {

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"@"+i);
        }
    }
}

package threadMethod03;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread2 extends Thread{
    public myThread2() {
    }

    public myThread2(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"@"+i);
        }
    }
}

4.出让线程/礼让线程

/*
*public static void yield();出让线程/礼让线程
* */
//表示出让(礼让)当前CPU的执行权
//尽可能让结果均匀
Thread.yield();

package threadMethod04;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class test {
    /*
    *public static void yield();出让线程/礼让线程
    * */
    public static void main(String[] args) throws InterruptedException {
        //创建线程对象
        myThread t1=new myThread();
        myThread t2=new myThread();
        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();//启动线程
        t2.start();//启动线程

    }
}

package threadMethod04;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread extends Thread{


    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {

            System.out.println(getName()+"@"+i);
            //表示出让(礼让)当前CPU的执行权
            //尽可能让结果均匀
            Thread.yield();
        }
    }
}

5.插入线程/插队线程

/*
*public static void join();插入线程/插队线程
t1.join();//表示把t1这个线程插入到当前线程之前
//当前线程:正在运行的线程

* */
package threadMethod05;
/**
 * @version 1.0
 * @auther Demo龙
 */
public class test {
    /*
    *public static void join();插入线程/插队线程
    * */
    public static void main(String[] args) throws InterruptedException {
        //创建线程对象
        myThread t1=new myThread();
        t1.setName("恐龙");
        t1.start();//启动线程

        t1.join();//表示把t1这个线程插入到当前线程之前
        //当前线程:正在运行的线程

        for (int i = 0; i < 20; i++) {
            System.out.println("main线程"+i);
        }

    }
}

package threadMethod05;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class myThread extends Thread{


    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {

            System.out.println(getName()+"@"+i);

        }
    }
}

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

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

相关文章

【手把手教你学会51单片机】数码管的动态显示

注&#xff1a;本文章转载自《手把手教你学习51单片机》&#xff01;因转载需要原文链接&#xff0c;故无法选择转载&#xff01; 如若侵权&#xff0c;请联系我进行删除&#xff01;上传至网络博客目的为了记录自己学习的过程的同时&#xff0c;同时能够帮助其他一同学习的小伙…

类的初始化2023018

类的初始化&#xff1a; 第一次使用某个类&#xff0c;例如Person类&#xff0c;系统通常会在第一次使用Person类时加载这个类并初始化这个类。在类的准备阶段&#xff0c;系统将会为该类的类变量分配内存空间&#xff0c;并指定默认初始值。当Person类初始化完成后&#xff0c…

高并发系统设计-Feed流系统设计

有两种实现方式&#xff1a;push和pull实现&#xff0c;首先讨论push模式 概念 我们在讲如何设计Feed流系统之前&#xff0c;先来看一下Feed流中的一些概念&#xff1a; Feed&#xff1a;Feed流中的每一条状态或者消息都是Feed&#xff0c;比如朋友圈中的一个状态就是一个Fe…

布隆过滤器算法

目录布隆过滤器主要有下面的参数&#xff1a;结论举例布隆过滤器主要有下面的参数&#xff1a; 1.假设数据量为n&#xff0c;预期的失误率为p&#xff08;布隆过滤器大小和每个样本的大小无关&#xff09;。 2.根据n和p&#xff0c;算出BloomFilter一共需要多少个bit位&#x…

【年度总结 | 2022】想干什么就去干吧,少年

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 程序人生专栏 | 年度总结 &#xff08; 2022 &#xff09; 作者&#xff1a; 计算机魔术师 版本&#xff1a; 1.0 &#xff08…

关于性能测试需要知道的

随着各企业的业务发展、用户量以及数据量的不断增加&#xff0c;系统承载的压力也会随之增加&#xff0c;服务系统的性能好坏又严重影响企业的利益。因此&#xff0c;性能测试重要性与需求越来越强烈。 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应…

JAVA 基础语法——(HelloWorld案例编写,Notepad软件的安装和使用,注释,关键字,常量,变量,计算机存储单元,数据类型,标识符,类型转换)

目录 HelloWorld案例的编写 Notepad软件的安装和使用 注释 关键字 常量 变量 计算机存储单元 数据类型概述 标识符 类型转换 HelloWorld案例的编写 首先定义一个类——–public class 类名在类定义后加上一对大括号 {}在大括号中间添加一个主(main)方法/函数——–publi…

详解Curl各参数的含义

详解Curl各参数的含义1. Introduction2. Detail2.1 参数-k2.2 参数-X2.3 参数-x2.4 参数-w %{http_code}2.5 参数-d2.6 参数-H2.7 参数-F2.8 参数-O2.9 参数-o2.10 参数-u2.11 参数-b2.12 参数-G3. Awakening1. Introduction [rootnolan ~]# curl -h Usage: curl [options...]…

如何快速部署一款小程序

小程序现在大家都不陌生&#xff0c;微信&#xff0c;qq&#xff0c;抖音&#xff0c;支付宝等等都有小程序&#xff0c;今天给的大家带有通用的小程序&#xff0c;如何快速部署两种方式&#xff1a;自己纯手工开发&#xff0c;或者找别人开发不管哪种方式&#xff0c;今天我带…

【数据结构与算法】选择排序

文章目录选择排序什么是选择排序&#xff1f;选择排序实例分析算法分析代码部分选择排序 什么是选择排序&#xff1f; 选择排序是一种简单直观的排序算法。 它的工作原理是&#xff1a;每一轮从待排序列中选取一个值最小的元素&#xff0c;将它和当前序列的第一个元素互换。 可…

【GD32F427开发板试用】4. ADC采集摇杆模块移动量

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;hehung 之前发帖 【GD32F427开发板试用】1. 串口实现scanf输入控制LED 【GD32F427开发板试用】2. RT-Thread标准版移植 【GD32F427开发板试用…

vue利用provide和inject做套娃组件设计

provide和inject原来用的不多&#xff0c;只是见人引用axios的时候在main.js里使用provide来注入 app.provide(axios, axios) 这样&#xff0c;在所有的vue文件里都可以使用inject来获取这个注入的axios const axios inject("axios"); 这种利用provide和inject做…

(考研湖科大教书匠计算机网络)第一章概述-第五节3:计算机网络体系结构之相关专业术语

文章目录一&#xff1a;实体二&#xff1a;协议三&#xff1a;服务四&#xff1a;协议数据单元本节对应视频 【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】&#xff1a;1.6 计算机网络体系结构&#xff08;4&#xff09;—专用术语 注意&#xff1a;本节内容…

2023MyBatis精选面试题2(8道)

一. MyBatis的框架架构设计是怎么样的这张图从上往下看。MyBatis的初始化&#xff0c;会从mybatis-config.xml配置文件&#xff0c;解析构造成Configuration这个类&#xff0c;就是图中的红框。1. 加载配置&#xff1a;配置来源于两个地方&#xff0c;一处是配置文件&#xff0…

【阅读笔记】《重构》 第一二章

第一章 重构&#xff0c;第一个案例 编译器不会在乎代码好不好看&#xff0c;都是正常运行的。但人在乎&#xff0c;差劲的系统很难修改&#xff0c;因为很难找到修改点&#xff0c;导致程序员很有可能犯错&#xff0c;从而引入bug 重构的第一步 得为即将修改的代码建立一组…

自动化测试Selenium【基础篇一】

自动化测试Selenium【基础篇一】&#x1f34e;一.什么是自动化测试&#x1f352;1.1 自动化测试介绍&#x1f352;1.2 单元测试&#x1f352;1.3 接口自动化&#x1f352;1.4 UI自动化&#x1f352;1.5 为什么选择selenium作为我们的web自动化工具?&#x1f352;1.6什么是驱动…

DaVinci:限定器 - RGB

调色页面&#xff1a;限定器Color&#xff1a;Qualifier限定器 - RGB Qualifier - RGB根据像素的三原色通道&#xff08;红、绿、蓝&#xff09;的值来选择画面上的对应区域&#xff0c;从而限制节点调色的范围。限定器 - RGB 根据指定的各个原色通道的色阶范围来选择连续的近似…

Java 对象处理流(ObjectOutputStream\ObjectInputStream)

文章目录前言什么是对象流&#xff1f;基本介绍ObjectOutputStreamObjectInputStream对象处理流的使用细节前言 处理流&#xff1a;是对一个已存在的流进行处理和封装&#xff0c;通过所封装的流的功能调用实现对数据的操作。而处理流中也有不同的分类&#xff0c;此片介绍的是…

C规范编辑笔记(十一)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) C规范编辑笔记(八) C规范编辑笔记(九) C规则编辑笔记(十) 正文&#xff1a; 因为太久没有更新了&#xff0c;今天就…

Elasticsearch7.8.0版本高级查询—— 多关键字精确查询文档

目录一、初始化文档数据二、多关键字精确查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","…