基本的线程机制

C#里用HttpListener实现WEB API接口服务端 本文介绍了一个基于WinForm的HTTP服务实现方案。该方案使用HttpListener类创建了一个支持JSON POST请求处理的轻量级Web服务器,主要特点包括:1) 纯线程方式实现请求监听和处理;2) 提供标准化的JSON响应格式;3) 支持自定义请求处理逻辑;4) 包含完整的日志记录功能。代码示例展示了如何初始化服务、处理不同类型的请求(包括JSON POST),并提供了线程安全的UI更新机制。该实现适用于需要简单HTTP接口的Windows桌面应用程序,可作为程序间通信的基础设施。 阅读详情

线程是比进程更轻量级的调度执行单位,各个线程既可以共享进程资源(内存地址、文件IO),又可以独立调度(线程是CPU调度的最小单元)。

多进程和多线程的区别:
1、本质区别在于每个进程拥有自己一整套变量,线程则是共享数据。因此共享变量使线程之间的通信比进程之间的通信更有效、更容易。
2、与进程相比较,线程更“轻量级”,创建、撤销一个线程比启动新进程的开销要小的多。

一、定义任务
1)通过实现Runnable接口并编写run()方法,使得任务可以执行我们的命令。
Runnable执行工作的独立任务,但不会返回任何值。

class LiftOff implements Runnable{
    protected int countDown = 10;
    private static int taskCount = 0;
    private final int id = taskCount++;
    @Override
    public void run() {
        while (countDown-- > 0){
            System.out.println(countDown);
            Thread.yield();
        }
    }
}

2)希望任务结束后有一个返回值,需要实现Callable接口并编写call方法。Callable是一个具有类型参数的泛型,它的类型参数表示是从方法call中返回的值,并且必须使用ExecutorService.submit()方法调用它。

class TaskWithResult implements Callable<String>{
    private int id;
    public TaskWithResult(int id){
        this.id = id;
    }   
    @Override
    public String call() throws Exception {
        return "result of TaskWithResult " + id;
    }
}
public static void main(String[] args){
    ExecutorService exec = Executors.newCachedThreadPool();
    ArrayList<Future<String>> results = new ArrayList<>();
    for (int i = 0; i < 10; i++){
        results.add(exec.submit(new TaskWithResult(i)));
    }
    try {
        for (Future<String> future: results){
            future.get();
        }
    }catch (ExecutionException e){
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

submit()方法会产生Future对象,它用Callable返回结果的特定类型进行参数化,isDone()方法用来查询Future是否已经完成,任务完成时,它具有一个结果,可以调用get()获取该结果。也可以不用isDone()检查直接调用get(),get()方法将阻塞,直至结果准备就绪。

二、线程的创建

1)Thread类来创建线程。Thread构造器只需一个Runnable对象。调用Thread对象的start()方法为该线程执行必需的初始化操作,然后调用Runnable的run()方法,以便在这个新线程中启动该任务
Thread t = new Thread(new LiftOff());
t.start();

start()调用后会快速的返回,run()方法会在新线程中执行
2)使用Executor创建线程。执行器(Executor)管理Thread对象,从而简化并发编程。Executor在客户端和任务执行之间提供了一个间接层;与客户端直接执行任务不同,中介对象将执行任务。Executor允许你管理异步任务的执行,而无需显式地管理线程的生命周期。
一般单个的Executor被用来创建和管理系统中所有的任务。shutDown()方法的调用可以防止新任务被提交给这个Executor。

FixedThreadPool可以一次性预先执行高昂的线程分配,限定线程的数量。可以节省时间,因为不用为每个线程都固定地付出创建线程的开销。
CachedThreadPool通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程。因此是首选,当这种方式会引发问题时,才需要切换到FixedThreadPool.
SingleThreadExecutor创建一个线程,每个任务都会在下一个任务开始之前运行结束,所有任务都使用相同的线程

三、线程常见名词

3.1休眠 sleep()
调用sleep()将使任务终止执行给定的时间
对sleep()的调用可以抛出InterruptedException异常,异常不能夸线程传播,所以必须在本地处理所有任务内部产生的异常

try {
    TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

3.2线程优先级
线程的优先级将线程的重要性传递给调度器,尽管CPU处理线程集的顺序不确定,但是调度器将倾向于让优先级高的线程先执行。并不是优先级底的线程得不到执行,仅仅是执行的评率较低。
获取线程优先级Thread.currentThread().getPriority();
设置线程优先级Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
设置优先级实在run()方法的开头设定的,在构造器中设定不会有任何好处,因为Executor在此刻还没有执行任务
JDK有10个优先级,因为与操作系统不能很好的映射,只使用MAX_PRIORITY, MIN_PRIORITY,NORM_PRIORITY三种级别。

3.3让步 yield()
通过调用yield()可以给线程调度器暗示,让别的线程使用CPU。yield()的调用也是建议具有相同优先级的线程可以运行。对于任何重要的控制或在调整应用时,都不能依赖于yield()。

3.4后台线程 daemon
后台线程指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程不属于程序中不可或缺的部分。所有非后台线程结束时,程序也就终止了,同时会杀死所有后台线程。
必须在线程启动之前调用setDaemon()方法,才能把它设置为后台线程。
Thread t = new Thread(new LiftOff());
t.setDaemon(true);
t.start();

通过定制ThreadFaactory可以定制由Executor创建的线程的属性(后台、优先级、名称)

class DaemonThreadFactory implements ThreadFactory{
    @Override
    public Thread newThread(@NonNull Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
}
ExecutorService exec = Executors.newCachedThreadPool(new DaemonThreadFactory());

可以通过isDaemon()来判断一个线程是否为后台线程。如果一个线程为后台线程那么它创建的任何线程都是后台线程。
注意:当最后一个非后台线程终止时,后台线程会“突然”终止,finally子句也不会执行

3.5加入一个线程join()
一个线程可以在其他线程之上调用join()方法,效果为等待一段时间直到第二个线程结束才继续执行。如某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复。
也可以在join()方法中带一个参数,如果目标线程在参数时间到期还没有结束,join()方法总能返回。

3.6捕获异常
由于线程的本质特性,不能捕获从线程中逃逸的异常。一旦异常逃逸出任务的run()方法,就会向外传播到控制台,除非采取特殊的步骤捕获异常。
Thread.UncaughtExceptionHandler允许在每个Thread对象上附着一个异常处理器

Thread t = new Thread(new LiftOff());
   t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      @Override
       public void uncaughtException(Thread t, Throwable e) {      
         }
       });
       t.start();
TPAMI 2024 | 重新思考多焦点图像融合中客观评价指标的有效性:一种基于统计的方法 作为一种延长光学镜头景深(DOF)的有效技术,多焦点图像融合最近成为图像处理社区的一个活跃话题。然而,该领域仍然存在一个未解决的主要问题,即缺乏选择客观评价指标的通用标准。因此,不同研究中使用的指标往往差异显著,导致难以实现公正的评估。为了解决这个问题,本文提出了一种基于统计的方法来验证多焦点图像融合中客观指标的有效性。核心思想是采用统计相关性度量来评估某个融合指标与一些流行的全参考图像质量评估模型之间的性能一致性。 阅读详情

相关推荐

Altium AD20的PCB板框绘制、定义板子形状、重新设置原点、放置尺寸标注

AD20的板框绘制与以前的版本不同,以前板框是在KeepOut层,而在AD20中没有这个层,绘制板框需要到机械层Mechanical1。 板框大小评估 首先进行板框大小评估。 工具 - 器件摆放 - 在矩形区域摆放。 之后通过鼠标框选矩形区域,元件会自动按照框选的范围进行摆放。这个操作可以重复多次,最后大致得出需要的板框尺寸。确定好后右键。 板框绘制,重新定义板子形状 点击下方的 Mechanical1,切换到机械层。放置线条,根据元件摆放来绘制PCB大致的形状,将元件完全包裹。

Mark_md的博客 10万+

多线程 (一)基础线程机制--线程状态--Executor

转载地址: https://github.com/CyC2018/Interview-Notebook一、使用线程实现 Runnable 接口实现 Callable 接口继承 Thread 类实现接口 VS 继承 Thread二、基础线程机制sleep()yield()join()deamon三、结束线程阻塞中断四、线程之间的协作同步与通信的概念理解线程同步线程通信五、线程状态转换六、Execut...

多多 1570

Chapter 5 Gate Drivers and Level Shifters

Gate driver如下图所示, 包括功率管(带保护), Gate driver, Level shifter, Gate Supply 和Dead-time control.

2304_76736886的博客 2233

基本线程机制

基本线程机制 一个程序可以被划分为多个独立的任务,每个独立的任务可以由线程来驱动执行; 一个进程可以包含若干个线程,即拥有若干个并发执行的任务,在程序运行时,CPU时间被划分成片段分配给所有的线程; 在单处理器的机器上使用多线程可以提高性能的原因在于任务阻塞; 为机器增加处理器可以显著加快使用多线程程序的运行速度; 使用线程机制使程序更加透明、可扩展,代码不需要知道它是运行在单处理器还是多处理器...

疯一样的码农 159

关键词‖旋变传感器

旋转变压器(以下简称旋变)安装在永磁同步驱动电机的非传动端,其作用是检测转子的位置和速度。目前,通常采采用结构简单、坚固耐用、环境适应性好的磁阻式旋变作为位置传感器。

m0_72345077的博客 2147

汽车诊断服务(UDS——0x11服务解析)

ECU复位服务(0x11)详解:该服务支持硬件/钥匙开关/软件三种复位类型(0x01-0x03),复位前需发送肯定响应。请求格式为11+子功能,响应含51+子功能。典型应用需配合安全访问流程,测试时需监控CAN总线通信及DTC状态。复位后ECU将返回默认会话,期间不处理任何诊断请求。服务在编程会话且安全解锁后执行,硬复位会初始化存储数据。

从事汽车行业 979

基础线程机制

Executor Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。 主要有三种 Executor: CachedThreadPool:一个任务创建一个线程; FixedThreadPool:所有任务只能使用固定大小的线程; SingleThreadExecutor:相当于大小为 1 的 FixedT...

程序猿_hw的博客 384

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

2301_81256766的博客 1256

线程机制与事件机制

文章目录进程与线程进程线程进程和线程之间的关系相关问题多进程与多线程单线程与多线程运行的区别JS是单线程还是多线程浏览器是单线程还是多线程浏览器是单进程还是多进程浏览器内核定义组成内核的不同模块定时器JS单线程执行的验证alert代码分类js引擎执行代码的基本流程为什么js设置为单线程事件循环模型相关概念执行栈浏览器内核回调队列(callback queue)事件轮询 event loop请求响应H5 Web Workers(多线程)单线程问题WebWorks介绍WebWorks使用图解分线程的作用分线程缺

mantou_riji的博客 1487

Vue3 + 高德地图实现车辆电子围栏监控与报警

通过本文的实现,我们完成了一个通用的车辆电子围栏监控功能:支持多种围栏类型。支持进入/离开/双向报警。使用缓存机制避免重复告警。可与Vue3 + 高德地图无缝集成。在实际项目中,可以结合WebSocket 实时定位,实现车辆的实时监控 + 围栏告警系统🚀。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 1033

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

1. 设置目标原件时,选择切换,这样就可以实现,当原件展示时,点击自动隐藏,隐藏时自动显示; 2. 展开/收起原件(推动/拉动原件)设置为方向**向下**

专注于计算机研发知识和资讯分享 1377

线程的基本协作机制

文章目录协作的场景wait/notify生产者/消费者模式同时开始等待结束异步结果集合点 多线程之间除了竞争访问同一个资源外,也需要相互协作,怎么协作呢?通过调用基本机制wait/notify 协作的场景 (1) 生产者/消费者模式: 常见的协作模式,生产者线程和消费者线程通过共享队列进行协作,生产者将数据或任务放到队列上,而消费者从队列上取数据或任务,如果队列长度有限,在队列满的时候,生产者需要...

涛涛之海 738

【Qt开发】管理OpenGL上下文QOpenGLContext类及应用实践示例代码

QOpenGLContext 提供了一个简单、高效的接口来管理 OpenGL 上下文。本文详细介绍了 QOpenGLContext 的基本功能、常用方法、信号槽机制、高级应用技巧及常见问题的解决方法。通过这些介绍,读者可以更好地掌握和利用 QOpenGLContext 进行 OpenGL 渲染和管理实验。对于有特殊需求的开发者,也可以通过探索更多高级设置和优化策略,以满足具体的应用场景。

科技改变人类,技术成就未来 1871

Java并发(二):基本线程机制之再续前缘

Java并发(二):基本线程机制之再续前缘 此篇笔记为上一篇笔记:Java并发(一):并发的多面性与基本的线程机制前缘中,Java并发的基本线程机制的后续。 后台线程 所谓后台(daemon)线程,是指在程序运行的时候在后台提供的一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会kill掉进程中所有的后台线程。 必须在线程启动之...

weixin_38196407的博客 222

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java 线程的基本协作机制

这里写目录标题15.3 线程的基本协作机制15.3.1 协作的场景15.3.2 wait/notify15.3.3 生产者/消费者模式15.3.4 同时开始15.3.5 等待结束15.3.6 异步结果15.3.7 集合点15.3.8 小结参考目录 15.3 线程的基本协作机制        多线程之间除了竞争访问同一个资源外,也经常需要相互协作,怎 么协作呢?本节就来介绍Java中多线程协作的基本机制wait/notify。  

norang的博客 646

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java线程的基本机制

线程 1、Java采用比较传统的方式,在顺序语言的基础上提供对线程的支持:多线程机制是在由执行程序所表示的单一进程中创建任务; 2、Java的线程机制是抢占式,即调度周期会周期性地中断线程,将上下文切换到另一个线程,从而为每一个线程提供时间片,使得每一个线程都会分配到数量合理的时间去驱动它的任务; 3、线程(Thread):一个任务从头到尾的执行流; 4、时间共享(time s

Al_assad的博客 912

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java 基本线程机制

当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。 独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。 动态性:进程与程序的区别在于,程序只是一个静态...

菜鸟踩坑 919

Java线程基本概念与多线程协调机制探讨

可能排版存在问题,可以在下载PDF版。 1.线程的基本概念 进程为程序执行提供了环境(比如,内存,与操作系统的交互接口)。而线程则是进程中代码执行的基本单元,它为“进程”中的程序代码提供了执行环境,并因此能够对程序代码的执行状态进行查看和管控。进程中如果没有线程,那就没有办法执行代码。在Java中,进程、线程结构关系如下: 简而言之,线程的为代码运行提供了堆栈(stack),记录调用中的...

故道白云的博客 534

并发之基本的线程机制

并发 并发是基于多核处理器编程的基本工具。 通常是用来提高单处理器上的程序的性能。从性能的角度看,如果没有任务阻塞,单处理器机器上使用并发就没有什么意义。 实现并发最简单的操作就是在系统级别使用进程。进程是运行在它自己的地址空间内的自包容的程序。 多任务操作系统通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个程序。java的并发系统会共享诸如内存和I/O这样的资源,因此并发最基本的困难在于协调不同进程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。 java在顺序语

qq_34622428的博客 245

Java多线程编程基础一(基本线程机制、线程调度器、线程状态)

文章引用 1 java编程思想 21章 基本的线程机制 p653 2 http://www.jb51.net/article/105487.htm 3 https://zhidao.baidu.com/question/1542633956525518747.html 一、基本的线程机制 并发编程使我们可以讲程序划分为多个分离的、独立运行的任务。通过使用多线程...

DemoTransfer 323

Linux - 线程的基本编程与同步互斥机制

线程是应用程序并发执行多种任务的一种机制,在一个进程中可以创建多个线程执行多个任务。每个进程都可以创建多个线程,创建的多个线程共享进程的地址空间,即线程被创建在进程使用的地址空间上。相较于进程来说,线程的创建不需要对地址空间进行复制,因此创建子线程比创建子进程要快得多。同一个进程中的多个线程可以并发的执行。在多处理器环境下,多个进程可以同时并行。如果一个线程因等待 I / O 操作而阻塞,那么其他线程仍然可以继续运行。同时,同一个进程创建的线程之间进行通信相对于进程来说,要方便、快速很多。原因在于线程之间是

icc_hhy的博客 610

Java并发(一):并发的多面性与基本的线程机制前缘

Java并发(一):并发的多面性与基本的线程机制 一、并发的多面性 并发编程令人困惑的一个主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多种,并且在这两者之间没有明显的映射关系(通常只具有模糊的界线)。 用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。 更快的执行 对于多处理器的机器,为了使程序运行得更快,并发赋予了利用额外处理器运行程序的能力。但是,并发通常是提...

weixin_38196407的博客 294

非常详细的JAVA并发基本线程机制

最详细的JAVA并发基本线程机制 编程问题中相当大的一部分都可以通过使用顺序编程来解决。然而对于某些问题,若果能够并发地执行程序中的多个部分,则会变得非常方便甚至非常必要,因为这些部分要么看起来在并发执行,要么在多处理器环境下可以同时执行。 JAVA是一种多线程语言,并提出了并发问题。实现并发最直接的方式是在操作系统级别使用进程。进程是运行在它自己的地址空间内的自包容程序。多任务操作系统可以通...

qq_44972915的博客 809

java基本线程机制

基本线程机制方法一实现Runnable接口,编写run()方法,在里面描述了要做的事。class A implements Runnable{ public void run(){ // 编写任务脚本 } }注意:如果在main()方法里直接调用run()方法,它不由单独的线程驱动,而是分配给运行main()方法的那个线程,意味着如果多个实例依次调用run()方法,那

uDon的博客 411

java并发编程-基础概念、volatile、synchronized、CAS、ABA、线程、线程基本机制

目录 基础概念 关键字volatile 关键字synchronized cas:不加锁实现原子操作(乐观锁) cas中的ABA问题 线程 进程与线程的区别 java线程的实现方式 线程优先级 线程状态 Daemon线程 线程基本机制 中断Interrupted 等待/通知机制 管道输入/输出流 Thread对象的join()方法 线程局部变量ThreadL...

qq_40918961的博客 1695
上一篇: WebView常用方法
下一篇: 共享受限资源
coderPlus
博客等级 码龄12年 1粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值