首页 > 编程语言 >多线程编程(面试重中之中,超简单理解)

多线程编程(面试重中之中,超简单理解)

时间:2024-08-31 16:23:20浏览次数:7  
标签:Thread 重中 编程 ThreadService 线程 new 多线程 falg public

最近项目比较紧急,固本之旅卡顿了一段时间,抽时间看了一下多线程,面试重点知识!!!

多线程编程

优点:

  • 提高程序的响应速度,增加用户的体验;

  • 提高计算机系统CPU的利用率;

  • 优化程序结构,将一个复杂的单线程分化成多个清晰化的单线程,更有利于维护

并行

指两个以上的事物在同一时刻同时发生在不同的地方(两个厨师各自炒各自的菜)

并发

多个任务在单个处理器上以快速交替的方式执行,给用户一种它们同时发生的错觉。(一个厨师同一时间炒不同的菜,来回快速切换)

线程中常用的方法

run:将需要线程操作的逻辑写进run方法

start:调用run方法,启动线程

currentThread:获取当前执行代码对应的线程

sleep:静态方法,调用时可以使当前线程睡眠指定毫秒数

yield:释放cpu的执行权

join:在线程A中通过线程B调用Join方法,意味着A进入阻塞状态,直到线程B执行结束在执行

isAlive:判断当前线程是否存活

创建多线程的四种方式

1:继承Thread基类,实现起来较为简单,但是局限性比较大,无法获得异常信息,返回值,而且由于JAVA是单继承的,继承Thread基类会影响当前类的可扩展性,不利于后续代码优化编写。

package com.yxb.security.demo.service.serviceImpl;
​
class ThreadService extends Thread {
    /**
     * @Description:
     * @author : loong
     * @Date: 2024-08-31
     */
    private Boolean falg;
​
    public ThreadService(Boolean falg) {
        this.falg = falg;
    }
​
    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            if (falg == false && i % 2 == 0) {
                System.out.println("双数"+i);
            }else if (falg == true && i % 2 != 0){
                System.out.println("单数"+i);
            }
        }
    }
}
​
public class ThreadExample {
    public static void main(String[] args) {
        ThreadService threadService = new ThreadService(false);
        threadService.start();
        ThreadService threadService1 = new ThreadService(true);
        threadService1.start();
    }
}

2:实现runnable接口

  • 通过实现runnable接口实现多线程,我们成功解决了java单继承的问题,因为JAVA是可以实现多个接口的,为代码的可延伸性提供了保障;

  • 更适合处理有共享数据的问题,我们可以通过多个线程调用同一个对象保证数据的一致性;

  • 实现了代码和数据的有效分离;

package com.yxb.security.demo.service.serviceImpl;
​
class ThreadService implements Runnable {
    public ThreadService(Boolean falg) {
        this.falg = falg;
    }
​
    /**
     * @Description:
     * @author : loong
     * @Date: 2024-08-31
     */
    private Boolean falg;
​
    @Override
    public void run() {
        for (int i = 1; i < 100; i++) {
            if (falg == false && i % 2 == 0) {
                System.out.println("双数"+i);
            }else if (falg == true && i % 2 != 0){
                System.out.println("单数"+i);
            }
        }
    }
}
​
class RunnableDemo{
    public static void main(String[] args) {
        ThreadService threadService = new ThreadService(true);
        Thread thread = new Thread(threadService);
        thread.start();
        Thread thread1 = new Thread(threadService);
        thread1.start();
    }
​
}

实现Callable接口:

  • 可以获得返回值

  • 可以通过throws的方式解决异常

  • 使用了泛型参数,可以指明call的返回值类型,更加灵活

创建线程池:

  • 提高了程序执行的效率(线程已经提前创建)

  • 提高了资源的复用率(线程执行完并未直接销毁,可以继续执行其他任务)

  • 有相关的参数,可以对线程池中的参数进行有效管理

线程池的七大参数:核心线程数,最大线程数,非核心线程空闲时间,时间单位,阻塞队列,线程工厂,拒绝策略

线程池执行流程:当请求来的时候先判断核心线程数是否已满(即便当前有空闲的核心线程,但是如果未达到核心线程数仍会创建处理),如果未满直接创建核心线程,如果已满则在判断队列是否满,如果未满,请求进入队列中,如果队列也满的话再判断,当前线程数是否到达最大线程数,如果没到达则直接创建非核心线程,如果当前线程数到了最大线程数则执行拒绝策略(默认抛出异常)。

package com.yxb.security.demo.service.serviceImpl;
​
import java.util.concurrent.*;
​
public class ThreadPools {
    /**
     * @Description:
     * @author : loong
     * @Date: 2024-08-31
     */
    public static void main(String[] args) {
        /*线程池七大核心参数*/
        /*从上往下是核心线程数,最大线程数,非核心线程空闲时间,时间单位,阻塞队列,线程工厂,拒绝策略*/
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,
                30,
                20L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
        for (int i = 0; i < 20; i++) {
            threadPoolExecutor.execute(()->{
                System.out.println(Thread.currentThread().getName());
            });
        }
    }
​
}

标签:Thread,重中,编程,ThreadService,线程,new,多线程,falg,public
From: https://blog.csdn.net/Loong_xiaobei/article/details/141754508

相关文章

  • 代码大全伪代码转换为高层次的注释是一种很好的编程实践
    首先,把伪代码转变为高层次的注释,并写出第一条和最后一条语句在C++中也就是“{”和“}”。伪代码示例/*Thisroutineoutputsanerrormessagebasedonanerrorcodesuppliedbythecallingroutine.Thewayitoutputsthemessagedependsonthecurrentproce......
  • SELL 脚本编程
      外壳式脚本编程和Linux程序设计类似。LinuxisnotUnix.Unix是美国大学较早进行研究的大学操作系统。系统商用之后会附加机器上面。操作系统是运行机器的驱动程序上面的应用程序。程序可以驱动硬件就是巨大的进步。 每个开发团队都有相应的开发任务。C语言程序设计......
  • JAVA多线程异步与线程池------JAVA
    初始化线程的四种方式继承Thread实现Runnable接口实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)线程池继承Thread和实现Runnable接口的方式,主进程无法获取线程的运算结果,不适合业务开发实现Callable接口+FutureTask可以获取线程内的返回结果,但是不利......
  • 【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • 基于live555开发的多线程RTSPServer轻量级流媒体服务器EasyRTSPServer开源代码及其调
    EasyRTSPServer参考live555testProg中的testOnDemandRTSPServer示例程序,将一个live555testOnDemandRTSPServer封装在一个类中,例如,我们称为ClassEasyRTSPServer,在EasyRTSPServer_Create接口调用时,我们新建一个EasyRTSPServer对象,再通过调用EasyRTSPServer_Startup接口,将EasyRTSP......
  • 【程序员必备】EditPlus:从文档界面到编程特性,全面升级你的编程体验!
    前言在科技日新月异的今天,正如乔布斯所言:“创新就是把事物联系起来的能力。”EditPlus正是这样一款集创新、高效与多功能于一体的文本编辑器,它以其卓越的性能和广泛的应用领域,在软件开发者和内容创作者中赢得了极高的声誉。这款工具是由韩国ES-Computing公司开发,自问世以来,凭......
  • 一个操作系统的设计与实现——第21章 高级可编程中断控制器
    21.1什么是高级可编程中断控制器我们已经使用过型号为8259A的可编程中断控制器(ProgrammableInterruptController,PIC)。在单CPU计算机中,中断的处理相对简单:所有的外设和CPU都连接在PIC上即可。然而,如果计算机中不止一个CPU,情况就会变得复杂起来。以双CPU为例:键盘中断会被每个C......
  • IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“
    例如:a线程输出”A”之后b线程输出”B”,然后a线程输出“A”,再b线程输出”B”,之后往复循环。【1】使用信号量实现代码展示:#include<stdio.h>#include<pthread.h>#include<string.h>#include<semaphore.h>#include<unistd.h>//定义两个全局信号量,实现同步机制se......
  • “从手动到自动:探索Cursor编辑器和Claude-3.5-Sonnet的AI编程工具“
    Cursor情况简介AI大神AndrejKarpathy都被震惊了!他最近在试用VSCodeCursor+ClaudeSonnet3.5,结果发现这玩意儿比GitHubCopilot还好用!Cursor在短短时间内迅速成为程序员群体的顶流神器,其背后的原因在于其默认使用OpenAI投资的Claude-3.5-Sonnet模型,这一举动不仅改变......
  • 新手入门编程:从零开始的全面指南
    编程是一种通过编写代码来让计算机执行特定任务的技能。随着科技的发展,编程已经成为一项必备的技能,无论你是打算从事软件开发、数据科学,还是希望了解现代技术的运作原理。本文将深入探讨编程的基础知识、常用语言及其特点、学习编程的步骤和技巧,以及实际编程中的常见问题与解......