首页 > 其他分享 >【多线程】 - 实现方法以及自定义线程池

【多线程】 - 实现方法以及自定义线程池

时间:2024-09-03 20:23:12浏览次数:6  
标签:Thread 自定义 class t1 线程 new 多线程 public

概念

进程

进程是程序的基本执行实体

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

多个线程组成了多线程

多线程应用场景

  • 软件中的耗时操作
  • 拷贝、迁移大文件
  • 加载大量的资源文件

想让多个事情同时运行就需要多线程

并发和并行

并发

在同一时刻,有多个指令在单个CPU上交替执行

并行

在同一时刻,有多个指令在多个CPU上同时执行

多线程实现方式

继承Thread类

public class ThreadDemo {
    public static void main(String[] args) {

        MyThread t1 = new MyThread();
        t1.start();
    }

}
public class MyThread extends Thread {

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

【多线程】 - 实现方法以及自定义线程池_java

实现Runnable接口的方式进行实现

public class ThreadDemo02 {
    public static void main(String[] args) {
        Myrun mr = new Myrun();
        Thread t1 = new Thread(mr);
        t1.start();

    }

}
public class Myrun implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("Hello World");
        }
    }
}

利用Callable接口和Future接口方式实

特点:可以获取到多线程运行结果

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

public class ThreadDemo03 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
       //创建MyCallahle对象
        MyCallable mc = new MyCallable();
        FutureTask<Integer> ft = new FutureTask<>(mc);
        Thread t1 = new Thread(ft);
        t1.start();
        Integer result = ft.get();
        System.out.println(result);

    }

}


import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum+=i;
        }
        return sum;
    }
}

多线程三种实现方式对比

【多线程】 - 实现方法以及自定义线程池_java_02

常见的成员方法

设置以及获取线程的优先级

默认优先级为5,优先级从1~10,10最大,优先级越高抢到CPU概率越高

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

public class ThreadDemo04 {
    public static void main(String[] args)  {
        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr,"飞机");
        Thread t2 = new Thread(mr,"坦克");

        System.out.println(t1.getPriority());
        System.out.println(t2.getPriority());

    }

}

【多线程】 - 实现方法以及自定义线程池_java_03

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

public class ThreadDemo04 {
    public static void main(String[] args)  {
        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr,"飞机");
        Thread t2 = new Thread(mr,"坦克");
//
//        System.out.println(t1.getPriority());
//        System.out.println(t2.getPriority());
        t1.setPriority(1);
        t2.setPriority(10);
        t1.start();
        t2.start();

//


    }

}

【多线程】 - 实现方法以及自定义线程池_java_04

设置为守护线程

守护进程更通俗的来说就是“备胎”,非守护进程就相当于你的女神,当非守护进程执行完毕之后,守护进程会陆续结束,就好比你追到你女神了,然后官宣了,然后“备胎”看见了,慢慢的慢慢的就对你疏远了

【多线程】 - 实现方法以及自定义线程池_实现方法_05

应用场景:

【多线程】 - 实现方法以及自定义线程池_java_06

当聊天界面关闭以后,传输文件就没必要执行了

出让线程

【多线程】 - 实现方法以及自定义线程池_java_07

插入线程

【多线程】 - 实现方法以及自定义线程池_java_08

线程的生命周期

【多线程】 - 实现方法以及自定义线程池_java_09

【多线程】 - 实现方法以及自定义线程池_实现方法_10

JVM里是没有运行状态的,这里只是为了方便理解。

线程安全问题

同步代码块

为了解决线程的随机性,在操作一些共享数据的代码时,会把作共享数据的代码锁起来

特点:锁默认打开,有一个进程进去了,锁自动关闭;里面的代码全部执行完毕,线程出来,锁自动打开

【多线程】 - 实现方法以及自定义线程池_实现方法_11

【多线程】 - 实现方法以及自定义线程池_实现方法_12

Lock锁

手动上锁与开锁

【多线程】 - 实现方法以及自定义线程池_实现方法_13

线程池

1.创建一个池子,池子中是空的

2.提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子,下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可

3.但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

Executors:线程池的工具类通过调用方法返回不同类型的线程池对象。

【多线程】 - 实现方法以及自定义线程池_实现方法_14

【多线程】 - 实现方法以及自定义线程池_java_15

自定义线程池

【多线程】 - 实现方法以及自定义线程池_实现方法_16

什么时候才会创造临时线程

当核心线程都在忙而且队伍当中已经排满了任务,这个时候才会创建临时线程

【多线程】 - 实现方法以及自定义线程池_线程池_17

当线程池满负荷运行时,就是触发任务拒绝策略

【多线程】 - 实现方法以及自定义线程池_实现方法_18

【多线程】 - 实现方法以及自定义线程池_线程池_19

public class MyThreadPoolDemo {
    public static void main(String[] args) {

        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,//核心线程数
                6,//最大线程数
                60,//空闲线程存活时间
                TimeUnit.SECONDS,//单位
                new ArrayBlockingQueue<>(3),//任务队列
                Executors.defaultThreadFactory(),//创建线程工厂
                new ThreadPoolExecutor.AbortPolicy()//任务拒绝策略
        );
    }
}

线程池多大合适

最大并行数

【多线程】 - 实现方法以及自定义线程池_线程池_20

CPU密集型(项目计算多)

最大并行数+1

I/O密集型(读取文件多)

【多线程】 - 实现方法以及自定义线程池_实现方法_21

【多线程】 - 实现方法以及自定义线程池_线程池_22

可以用工具thread dump测试时间


标签:Thread,自定义,class,t1,线程,new,多线程,public
From: https://blog.51cto.com/u_15858858/11910163

相关文章

  • 使用自定义注解校验回款金额是否大于订单金额
    `/**自定义注解类处理器复合注解比较a表中x字段值是否大于b表中y字段值@AuthorLiZhiMin@Date2024/8/3117:34*/@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceFieldCompareValidators{/**要查询......
  • 高效并发编程:使用Python线程池执行任务
    高效并发编程:使用Python线程池执行任务在现代软件开发中,处理并发任务是提高程序性能和响应速度的关键技术之一。Python作为一种广泛使用的编程语言,提供了多种并发编程工具,其中线程池(ThreadPool)是一个非常实用的工具。本文将详细介绍如何编写一个函数,使用线程池执行一组任务......
  • 二、并发编程与多线程-2.1、J.U.C和锁(中篇)
    2.1、J.U.C和锁(中篇)2.1.4、什么是CAS?答:CAS是Java中Unsafe类里面的方法,全称是CompareAndSwap,是比较并交换的意思。作用就是保证在多线程环境下,对于修改共享变量操作的原子性。扩展:CAS保证修改共享变量操作原子性的实现逻辑:CAS方法里有三个参数,依次分别是共享变量的内......
  • ant design vue 上传文件自定义上传,并发上传文件、取消上传、重新上传
    antdesignvue上传文件组件<a-upload-draggerv-model:fileList="fileList":accept="accept":beforeUpload="beforeUploadFile"class="upload-btn":headers="headers"multiple@change="ha......
  • flask多线程下数据库操作(简单示例)
    前言背景:开了两个线程操作数据库插入但是获取不到db的信息,自己摸索的方法不一定是最佳的,有更好的可以评论或私信,感谢大佬话不多说,直接上代码 #模型里面的多线程新增操作@staticmethoddefadd_users_by_thread(username,password,session):user=U......
  • 为什么多线程会带来性能问题?
    为什么多线程会带来性能问题?什么是性能问题在上一篇中,我们已经学习了多线程带来的线程安全问题,但对于多线程而言,它不仅可能会带来线程安全问题,还有可能会带来性能问题,也许你会奇怪,我们使用多线程的最大目的不就是为了提高性能吗?让多个线程同时工作,加快程序运行速度,为什么反而会带来......
  • 哪些场景需要额外注意线程安全问题
    今天我们主要学习哪些场景需要额外注意线程安全问题,在这里总结了四种场景。访问共享变量或资源第一种场景是访问共享变量或共享资源的时候,典型的场景有访问共享对象的属性,访问static静态变量,访问共享的缓存,等等。因为这些信息不仅会被一个线程访问到,还有可能被多个线程同时访问,那......
  • Win32远线程注入
    远线程注入远线程(RemoteThread)注入是指一个进程在另一个进程中创建线程的技术,这是一种很经典的DLL注入技术。虽然比较古老,但是很实用。通过远线程注入,再配合api函数的hook技术,可以实现很多有意思的功能。实现远线程注入的关键函数OpenProcess打开现有的本地进程,函数声......
  • 线程实现每秒查询设备状态,有变化时执行其他操作
    1.写一个线程方法去判断状态值是否改变privatevoidwaitForDeviceStatus(IntByReferencesenor_code,IntByReferencestatus_code,StringtargetHex){ThreadstatusThread=newThread(()->{try{//在这里调用查看设备状态方......
  • 自定义缓存组件 代替 Spring@Cache缓存注解
    自定义缓存组件代替Spring@Cache缓存注解  在实现上述功能之前先来点基础的,redis在SpringBoot项目中常规的用法,好对缓存和redis客户端的使用有一定了解。  1.添加依赖redis客户端依赖(连接redis服务端必备 )<!--客户端依赖二选一--><dependency><groupId>redi......