首页 > 其他分享 >多线程应用案例

多线程应用案例

时间:2023-04-12 22:08:21浏览次数:42  
标签:join System 案例 线程 应用 CountDownLatch println 多线程 out


需求

解析一个Excel中多个sheet的数据,那么此时就可以考虑使用多线程,每个线程解析一个sheet中的数据,然后等待所有的sheet数据解析完成后,再把数据入库

在这个需求中,要实现主线程等待所有现场完成shee数据解析操作,

第一种方案:采用join()方法

public class MyJoinTest {
public static void main(String[] args) throws InterruptedException {
        System.out.println("开始解析数据");
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("解析sheet1 的数据");
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("解析sheet2 的数据");
            }
        });
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println("入库");
        System.out.println("完成");
    }
}

执行结果:

多线程应用案例_数据

看一下Thread的join方法

public final void join() throws InterruptedException {
    join(0);
}

多线程应用案例_ide_02

死循环检查join线程是否活着,如果join线程活着则让当前线程永远等待,其中wait(0);表示永远等下去。直到join线程终止后,线程的this,notifyAll()方法会被调用,调用this.notifyAll方法是在JVM里面实现的。只有再JVM源码里能看见。

在JDK1.5后的并发包下提供了CountDownLatch也可以实现join的功能,并且比join的功能更多,

第二种方案:CountDownLatch

代码如下:

public class MyCountDownLatch {
static CountDownLatch count = new CountDownLatch(2);
    public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("解析sheet1 的数据");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("解析sheet2 的数据");
                count.countDown();
            }
        }).start();
        count.await();
        System.out.println("入库");
        System.out.println("完成");
    }
}

执行结果

多线程应用案例_System_03

CountDownLatch的构造函数接收一个Int类型的参数作为计数器,如果你想等待n个点完菜,这里就传n。

当我们调用CountDownLatch的countDown()方法时候n就减1即就是n=n-1。CountDownLatch的await方法会阻塞当前线程,知道n=0,由于countDown()方法可以再任何地方使用,所以这里的n个点,可以是n个线程,也可以是一个线程里的n个执行步骤。用在多线程时,只需要把这个CountDownLatch的引用传递到线程里即可。

注:

计数器必须大于0,计数器等于0的时候,调用await方法是不会阻塞当前线程,CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器的值,一个线程调用countDown方法happen-before,另外已发个线程调用await方法。

参考:《Java并发编程的艺术》



标签:join,System,案例,线程,应用,CountDownLatch,println,多线程,out
From: https://blog.51cto.com/u_11702014/6186299

相关文章

  • threading多线程使用
    当我们调用某段代码时需要等待一段时间后才能进行后续的操作,而这期间计算资源并未占满,这就浪费了CPU的资源和时间,此时可以采用多线程进行并行计算。如当我们使用爬虫爬取网络资源时,某个资源的爬取过程由于网络因素需要等待,而后续的资源清洗和整合等需要等待,此时可以将资源分多份......
  • mybatis全局变量 (mybatis.configuration.variables) 的应用
    mybatis.configuration.variables是一个可自定义的全局变量:在application.yml中定义:mybatis:mapper-locations:classpath:mapper/*.xmltype-aliases-package:com.example.entityconfiguration:variables:dbtype:mysqlmapper.xml中的使用:<!--更新......
  • java多线程 - 狂神
    多线程实现方法第一种方法:Thread自定义线程类继承Thread类重写run()方法,编写线程执行体创建线程对象,调用start()方法启动线程注意:线程不一定立即执行,由CPU安排调度继承Thread类创建多线程packagecom.waves.dxcdemo;​importjava.text.DateFormat;importja......
  • springboot整合阿里云OSS实现多线程下文件上传(aop限制文件大小和类型)
    内容涉及:springboot整合阿里云oss自定义注解及aop的使用:对上传文件格式(视频格式、图片格式)、不同类型文件进行大小限制(视频和图片各自自定义大小)线程池使用:阿里云OSS多线程上传文件阿里云OSS分片上传大文件 业务需求需求一:前端传递单个或多个小文件(这里......
  • JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么)
    JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么) 1开门见山新建一个tomcatweb项目,配置tomcat的虚拟目录,取默认值(/项目名_war_exploded)那么如果你的tomcat的默认站点(即http://localhost:8080)没有更改的话,这个项目的两个重要的根目录就出来了web站点根目......
  • 多线程篇
    1.Java中实现多线程的几种方法继承Thread类实现Runnable接口实现Callable接口线程池方式创建2.使用Thread、Runnable和Callable创建线程的优缺点采用继承Thread类的方式创建线程的优缺点优点:直接使用this即可获取当前线程,编程简单缺点:已经继承了Thread类......
  • 通过UIApplicationMain实现应用内多种事件拦截
    简介UIApplicationMain大家并不陌生,因为在通过XCode建立iOS的Ojective-C工程时肯定会看到。新建的main.m文件长这样:intmain(intargc,char*argv[]){NSString*appDelegateClassName;@autoreleasepool{appDelegateClassName=NSStringFromClas......
  • MBI5253GFN-A专为LED视频应用而设计的16通道PWM恒流LED驱动器芯片
    MBI5253GFN-A是为使用内部脉宽调制(PWM)控制的LED视频应用而设计的,具有可选择的14位/13位色深。MBI5253具有一个16位移位寄存器,它将串行输入数据转换为输出端口的每个像素灰度。16个调节电流端口设计用于提供均匀和恒定的电流接收器,以驱动具有广泛VF变化范围的LED。输出电流可以通过......
  • 同步合约数据到数据库经典案例2
    在上一篇文章中,我们从eventlog中同步数据。本篇我们尝试直接调用合约来获取数据。在我们的示例合约中,定义了一个struct用来保存数字藏品的上架信息。```javascriptstructsalesInfo{addresssales;addresscollection;uint96token_id;addresstoken;uint......
  • 在电子文档管理系统中应用鱼群算法的优势
    鱼群算法是一种基于自然界中鱼群行为的计算机算法,可以用于优化问题的解决。在电子文档管理系统中,鱼群算法可以用来管理和优化文档的检索和分类。 通过鱼群算法,可以将文档分为不同的群体,并对不同群体的文档进行分类和管理。例如,可以对相似的文档进行聚类,以方便用户检索和浏览。此外......