多线程的三种创建方式&守护线程

c/c++:守护进程、线程、线程之间共享和非共享资源、线程常用函数 目录 一、 守护进程 1.1进程组 1.2会话 1.3创建守护进程的步骤 二、线程 2.1 线程之间共享和非共享资源 2.2创建线程pthread_create 2.3 获取当前线程的线程ID pthread_self 2.4 线程退出pthread_exit 2.5 回收子线程资源 pthread_join 2.6 线程分离 pthread_d... 阅读详情

1. 多线程的中创建方式

  • 方式一:继承Thread方法
  • 方式二:实现Runnable 接口
  • 方式三:实现Callable接口
  1. 因为前面连个之前已经讲过了,所以这里主要强调的是第三种方式创建线程
  2. Callable接口时JDK1.8之后新设置的一个接口,主要作用是在重写 call() 方法的时候可以返回参数
package Timer_;
​
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
​
public class Timer_ {
    public static void main(String[] args) {
//      使用匿名内部类, FutureTask相当于Thread 的作用,new 出来的对象,没有start方法,
//      还是要通过new Thread 对象调用start方法来启动线程
        FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(1000 * 2);
                System.out.println("MyCall线程开始运行...");
                return "返回值!";
            }
        });

        Thread td = new Thread(ft);
        td.start();
​
        String result = null;
        try {
            result = ft.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("main线程得到了"+result);
        System.out.println("main线程结束了...");

    }
}

  • 运行结果:

    MyCall线程开始运行...
    main线程得到了我是返回值!

    main线程结束了...

1.1 基本实现步骤:

  1. 第一步: FutureTask ft = new FutureTask(new Callable(){ @Override public String call() throws Exception {//run() 自动被调用 System.out.println("MyCall线程开始"); Thread.sleep(1000 * 10); return "返回值!"; } });
  2. 第二步: Thread ta = new Thread(ft);
  3. 第三步: ta.start();// 执行call()
  4. 第四步:Object Object o = ft.get();//处理异常,导致当前线程阻塞,继续执行当前线程
  5. 第五步: 获取结果处理结果

2. 守护线程

  • 概念:
  1. 用户线程: 执行任务,任务完成之后关闭
  2. 守护线程: 之哟啊有一个用户线程在运行,守护线程就一直运行,比如: GC垃圾回收器
  3. 守护线程的用法: 线程对象. setDaemon(true);

3. 时钟Timer

  • 作用: 用作周期性业务,比如文件备份,备份日志等
  1. new Timer (true) :守护(守护线程)始终
  2. new Timer () 非守护线程
  • 用法
  1. public void schedule ( TimerTask task, Date firstTime, long period)
  2. 第一个task ,要执行的任务(打印系统日志),Date firstTime:第一次开始日期,long period :周期
  3. public abstract class TimerTask 可以传入线程对象的构造方法中
  4. TimerTsk extends Object implements Runnable
  5. public abstract void run ();

3.1 具体用法-案例

  • 需求分析: 要求写一个守护始终,同步系统时间,每隔5s打印一次系统时间,主线程main每隔 1s 打印一次系统时间,打印30次结束程序。
package Timer_;
​
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
​
public class Timers_ {
    public static void main(String[] args)   {
​
        Timer timer = new Timer(true);  // 创建守护时钟
        Mytask mytask = new Mytask();
​
        Date time =null;
        SimpleDateFormat spf = new SimpleDateFormat("yyyy年 MM月 dd日 HH时:mm分:ss秒");
        try {
            time = spf.parse("2022年 08月 10日 22时:05分:50秒");
        } catch (ParseException e) {
            e.printStackTrace();
        }
​
        timer.schedule(mytask,time,1000*5);
​
        for (int i = 0; i < 30; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("mian线程执行到"+i);
        }
        System.out.println("main线程执行结束...");
    }
}
​
class Mytask extends TimerTask {
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        //        HH 是24小时进制,月份MM必须大写
        SimpleDateFormat spf = new SimpleDateFormat("yyyy年 MM月 dd日 HH时:mm分:ss秒");
        String time  = spf.format(new Date());
        System.out.println(name+"--->"+time);
    }
}

运行结果:

例题总结:

  1. 这是一个非常有意思的例题,首先考察的是对时间Date类的运行,一定要非常的熟练才行
  2. 考察对线程的应用,守护始终就是一个扩张,通过运行结果图,我们可以很清楚的看到程序已经实现 了预期效果
  3. 如果将守护始终配合IO流进行扩展,那么不久可以打印出我们想要的程序运行日志了嘛!还是非常有意思的
  4. 最后留一个小点,这里Mytask类,非常显眼,可以直接schedule方法中写成匿名内部类,这样看上去更加简洁一些,匿名内部类可以写接口,也可以写抽象方法!!

 

多线程(三种实现方式&守护线程&礼让线程&插入线程) 多线程可以拆开理解,“多”是一个数量词,表示很多的意思,所有我们只要知道什么是线程就可以了。(1)进程:程序的基本执行实体举个例子:比如打开任务管理器,在任务管理器的第一个界面中就是进程。看下面每一个软件都对应着一个进程。所以说什么是进程?一个软件运行之后他就是一个进程,比如Typora的进程,画图板的进程。(2)线程:线程是操作系统能够就行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 阅读详情

相关推荐

【线程创建】——三种方式➕多线程案例练习

Thread , Runnable , Callable它继承了老祖宗 Object java.lang.Object java.lang.Thread它实现了 Runnable接口线程是程序中执行的线程. Java虚拟机允许应用程序同时执行多个执行线程.每个线程都有优先权. 就是你的优先权更高你先执行, 你的优先权低你就后执行, 还有守护线程, 和用户线程, 这个地方先不聊, 本章主要讲如何创建线程创建一个新的线程有两种方法, 一个是将一个类声明为Thread的子类, 这个子类应该重新run类的方法T

Jean·z的博客 979

JAVA多线程基础篇--守护线程(Daemon Thread)

JAVA中的线程主要分为两类:用户线程(User Thread)和守护线程(Daemon Thread)。JAVA语言中无论是线程还是线程池,默认都是用户线程,因此用户线程也被称为普通线程。守护线程也被称之为后台线程、服务线程或精灵线程,守护线程是为用户线程服务的,当线程中的用户线程都执行结束后,守护线程也会跟随结束。守护线程具有自动结束生命周期的特性,而非守护线程则不具备该特性。本文将编写一些案例,同时根据源码来对用户线程和守护线程进行分析,帮助大家更好地理解。

qq_33479841的博客 2256

【WPF】渲染失败甚至程序崩溃,D3DImage.Lock卡死,报COMException异常和UCEERR_RENDERTHREADFAILURE消息

最近遇到WPF程序抛出ystem.Runtime.InteropServices.COMException异常,异常消息UCEERR_RENDERTHREADFAILURE (Exception from HRESULT: 0x88980406),或者先在D3DImage.Lock卡死,然后再出异常的问题。 现象和复现方法 出现了标题中的现象,你很可能有至少两个屏幕,并且可能在你的程序中直接或间接用了如下的库或技术: 1、WpfD3D这个开源库 2、自行使用了WPF中的D3DImage类,实现D3D

几罗星人的专栏 8254

蓝桥---区间k大数查询

import java.util.Arrays; import java.util.Scanner; public class test01 { public static void main(String[] args) { Scanner reader=new Scanner(System.in); int x=reader.nextInt(); int[] array=new int[x]; for (int i = 0; i &lt; x; i++) { array[i

IT老实人的博客 353

告别盲调!用Synopsys VIP搭建PCIe 5.0验证环境,手把手搞定链路训练与均衡调试

本文详细介绍了基于Synopsys VIP搭建PCIe 5.0验证环境的实战指南,重点解析了链路训练(LTSSM)与均衡调试的关键技术。通过配置VIP组件、设计验证平台架构及实战调试技巧,帮助工程师高效解决PCIe 5.0验证中的常见问题,提升芯片验证效率与可靠性。

weixin_28700411的博客 457

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

【Python】线程和多线程的使用

线程是计算机中的基本执行单元。一个进程中可以拥有多个线程,这些线程可以并发地执行不同的任务。线程共享进程的资源,包括内存空间、文件和其他系统资源。通过使用多线程,程序可以在同一时间执行多个任务,提高系统的并发性和响应性。线程可以分为用户线程和内核线程。用户线程是由应用程序开发者创建和管理的,它们只在用户空间内运行,不需要内核的支持。而内核线程是由操作系统内核创建和管理的,它们在内核空间内运行,并通过系统调用来与操作系统进行交互。线程的创建和销毁是轻量级的操作,相比于进程的创建和销毁,更加高效。

黎明总是如期而至 2637

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 357

Java守护线程

守护线程是所有非守护线程的保姆,当所有非守护线程执行完成或退出了,即使还有守护线程在运行,JVM也会直接退出,因此守护线程通常是用来处理一些辅助工作。典型的守护线程如垃圾回收GC线程,当用户线程都结束后,GC也就没有单独存在的必要,JVM直接退出。Java中,通过Thread类,我们可以创建2种线程,分为守护线程和用户线程。当线程设置为守护线程后,主线程一旦执行完毕,程序退出,守护线程也随着立即终止。反之,对于非守护线程,只要有一个在运行,JVM就不会退出。,也就是创建此线程所在的线程。

justlpf的专栏 3194

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022

【测试】echo发送和接收TCP/UDP数据包|shell 发送TCP/UDP数据包

目录 通过/dev/tcp、/dev/udp shell给tcp或udp服务发送16进制报文指令 通过/dev/tcp、/dev/udp (https://blog.youkuaiyun.com/u010039418/article/details/86251470) 通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。 直接发送 格式 /dev/udp/ip/port 比如要向本地10001端口发送数据,可以使用 ec.

我的笔记本 1万+

【Python多线程】守护线程 & 阻塞线程

文章目录守护线程守护线程的继承性join()阻塞 系列精选 Python爬虫速度很慢?并发编程了解一下吧 守护线程 在 Python 多线程中,主线程的代码运行完后,如果还有其他子线程还未执行完毕,那么主线程会等待子线程执行完毕后再结束;这就会有产生一个问题,如果有一个线程被设置成无限循环,那么意味着整个主线程( Python 程序)就不能结束。举个例子看一下。 import threading import time # 非守护线程 def normal_thread(): for i i

向日葵的专属太阳 4918

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

862

Java高级编程—多线程(完整详解线程的三种实现方式、以及守护线程、出让线程、插入线程、线程声明周期等,附有代码+案例)

Java高级编程—多线程(完整详解线程的三种实现方式、守护线程、出让线程、插入线程、线程声明周期等,附有代码+案例)

Java技术加油站的博客 1962

MediaPipe 教程:从安装到应用-全网最全

MediaPipe是Google推出的开源框架,专为构建机器学习管道设计,可以高效处理视频、音频等时间序列数据。本文教程从安装到应用逐步讲解: 安装步骤简单,只需通过pip安装mediapipe包并验证版本; 重点演示人体姿态检测功能,可识别33个身体关键点; 提供基础代码实现,包括视频捕获、关键点检测与可视化; 强调模块化开发,将功能封装成类以提高代码复用性。 教程适合初学者,通过清晰指引和实用代码示例,帮助快速实现计算机视觉应用。

FJN110的博客 1563

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【多线程 (一)】实现多线程的三种方式、线程休眠、线程优先级、守护线程

本文讲述了并发和并行,进程和线程的相关概念,并举了形象的例子以便于读者理解,还讲述了实现多线程的三种方式,以及三种方式对比之下的优缺点,并且介绍了线程休眠、线程优先级、守护线程的相关知识点。

hihielite的博客 1003

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java多线程(一):线程的创建方式和常见构造方法以及常用属性

1.3 进程和线程的区别进程是包含线程的,

2401_87254593的博客 1762

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

今天开始就来总结一下java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及线程优先级 4.线程的状态转化关系 1.什么是线程以及多线程与进程的区别         在现代操作在运行一个程序时,会为其创建一个进程。例如启动一个QQ程序,操作

zejian的博客 1万+

Java创建多线程的三种方式

前言 这篇文章主要讲述线程的概念、组成、Java创建多线程的三种方式以及线程的类型。 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控制块)、栈、程序、数据组成。 线程:是一个进程中的程序代码的一个执行序列,被认为是带有自己的程序代码和数据的虚拟处理机的封装,其由处理机、代码、数据三部分组成,你可以这样理解线程是在进程内部同时做的事...

qq_40477092的博客 225

多线程-守护线程

多线程中的守护线程是一种类型的线程,它在后台运行,不会阻止程序的退出。当所有的非守护线程结束时,守护线程也会自动结束。守护线程的创建和普通线程的创建方式相同,使用Thread类或者继承Thread类。使用setDaemon()方法将线程设置为守护线程,默认情况下线程是非守护线程。守护线程的主要作用是为其他线程提供服务,如监控、日志记录等。守护线程在执行过程中会随着所有非守护线程的结束而结束,即使守护线程未执行完其任务。守护线程不能持有或者修改非守护线程的资源,否则会引发线程安全问题。

Flying_Fish_roe的博客 3710

JAVA多线程-创建线程的三种方式

一、进程和线程 1.1、进程 一个正在执行中的程序就是一个进程,系统会为这个进程发配独立的内存资源。进程是程序的一次执行过程,它有自己独立的生命周期,它会在启动程序时产生,运行程序时存在,关闭程序时消亡。例如QQ就是一个进程 1.2、线程 线程是由进程创建的,是进程的一个实体,是具体干活的人,一个进程可能有多个线程。线程不独立分配内存,而是共享进程的内存资源,线程可以共享cpu的计算资源。 1.3、上下文切换 用户线程执行的过程我们称之为用户态,内核调度的状态称之为内核态,每一个线程运行时产生的数据我们称之

Lyajpunov的博客 477

多线程:守护线程有什么样的作用?

看字面意思,大多数新手认为守护线程的意思是守护好别的线程,不让他们结束。 实际的意思是把一个线程标记为“守护线程”,就是当他是一个“后台线程”or“内部线程”,类似于管理内存垃圾回收的线程一样。 Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程。当所有线程都运行结束时,JVM退出,进程结束。 如果有一个线程没有退出,JVM进程就不会退出。所以,必须保证所有线程都能及时结束。 但是有一种线程的目的就是无限循环,例如,一个定时触发任务的线程: class TimerThread ex

追求大牛之人的博客 1万+

Java多线程一(线程的三种创建方式)详细 简单 易懂

我们之前学习的程序在没有跳转语句的情况下,都是由上至下沿着一条路径依次执行。现在想要设计一个程序,可以同时有多条执行路径同时执行。比如,`一边游戏,一边qq聊天,一边听歌`,怎么设计?

m0_61160520的博客 1072

多线程(10)守护线程

守护线程(Daemon Thread)在Java中是一类特殊的线程,主要用于为其他线程(即用户线程)提供服务,它通常不用于执行业务操作,而是在后台执行一些系统性的任务。守护线程的核心特点是:它不会阻止Java虚拟机(JVM)的退出。换言之,当所有非守护线程(用户线程)结束时,JVM会终止程序,不管守护线程的状态如何。

qq_43012298的博客 1392

Python的多线程、多进程以及守护线程、守护进程详解

目录 一:基础知识 二:线程和守护线程,锁 2.1 线程创建 2.2 守护线程 2.3守护线程和非守护线程并存的情况 2.4锁的基本用法 三:多进程和守护进程 3.1 多进程创建 3.2守护进程创建 四:选择多线程还是多进程 近期在工作中,遇到了Python的多线程和守护线程的问题,中间还被一篇文章误导了,所以感觉有必要根据查到的资料和自己的实践梳理一下关于python的多进程和多线程问题。 一:基础知识 线程:线程是CPU一个基本的执行单元。它必须依托于进程...

ftzchina的博客 4442
上一篇: 高性能分布式No SQL数据库Aerospike——常用工具使用
下一篇: 带你轻松玩转Java继承
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值