多线程应用多接口合并执行

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位
多线程:多个线程并行执行任务

最大优点:最大限度的利用CPU的空闲时间来处理其他任务,提高效率

多线程应用场景一:

一接口内部同时调用3个甚至更多的接口方法,正常情况下一个方法调用这些接口是同步执行的,所用的时间是所有调用方法时间的总和。这样接口调用时间会很长,会影响客户体验;在高并发的情况下会严重影响性能,甚至拖垮服务器。所以我们可以把多个接口通过多线程的方式执行,大大提高执行效率;即一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景

 

代码实现:

 

package fills.thread;

import java.util.Random;
import java.util.concurrent.*;

public class ThreadUtil {
   
/**
     *
定义要执行的任务A
     * @throws
Exception
    
*/
   
public void threadA() throws  Exception{
       
Random random = new Random();
       
int time = random.nextInt(1000);
       
Thread.sleep(time);
       
System.out.println("A"+time);
    }
   
/**
     *
定义要执行的任务B
     * @throws
Exception
    
*/
   
public void threadB() throws  Exception{
       
Random random = new Random();
       
int time = random.nextInt(1000);
       
Thread.sleep(time);
       
System.out.println("B"+time);
    }

   
/**
     *
定义要执行的任务C
     * @throws
Exception
    
*/
   
public void threadC() throws  Exception{
       
Random random = new Random();
       
int time = random.nextInt(1000);
       
Thread.sleep(time);
       
System.out.println("C"+time);
    }

   
public static void main(String[] args) throws Exception{
       
ThreadUtil util = new ThreadUtil();
       
long s  = System.currentTimeMillis();
       
util.threadA();
       
util.threadB();
       
util.threadC();
       
System.out.println("同步执行时间"+(System.currentTimeMillis()-s)+"ms");
        s=
System.currentTimeMillis();
       
util.executorService(util);
       
System.out.println("自定义CAS执行时间"+(System.currentTimeMillis()-s)+"ms");
        s=
System.currentTimeMillis();
       
util.treadPoolExecutor(util);
       
System.out.println("当前线程活跃数CAS执行时间"+(System.currentTimeMillis()-s)+"ms");
        s=
System.currentTimeMillis();
       
util.countDownLatch(util);
       
System.out.println("countDownLatch阻塞线程执行时间"+(System.currentTimeMillis()-s)+"ms");

    }

   
/**
     *
通过Executors创建线程池实现
    
* @param util
    
*/
   
public void executorService(ThreadUtil util){
       
ExecutorService pool = Executors.newFixedThreadPool(3);
       
ThreadEntiry threadEntiry = new ThreadEntiry();
       
pool.execute(new ThreadTest("A",threadEntiry,util));
       
pool.execute(new ThreadTest("B",threadEntiry,util));
       
pool.execute(new ThreadTest("C",threadEntiry,util));
       
//可以根据自定义期望值自实现CAS自旋
       
while(!threadEntiry.isThreadA()||!threadEntiry.isThreadB()||!threadEntiry.isThreadC()){
        }
       
System.out.println(threadEntiry.isThreadA()+"  "+threadEntiry.isThreadB()+"  "+threadEntiry.isThreadC());
       
pool.shutdown();
    }

   
/**
     * ThreadPoolExecutor
可以自建线城池
    
* @param util
    
*/
   
public void treadPoolExecutor(ThreadUtil util){
       
ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 10,
               
0L, TimeUnit.MILLISECONDS,
               
new LinkedBlockingQueue<Runnable>());
       
ThreadEntiry threadEntiry = new ThreadEntiry();
       
pool.execute(new ThreadTest("A",threadEntiry,util));
       
pool.execute(new ThreadTest("B",threadEntiry,util));
       
pool.execute(new ThreadTest("C",threadEntiry,util));
       
//可以根据线程当前活跃数CAS自旋
       
while(pool.getActiveCount()!=0){
        }
       
System.out.println(threadEntiry.isThreadA()+"  "+threadEntiry.isThreadB()+"  "+threadEntiry.isThreadC());
       
pool.shutdown();
    }

   
/**
     *
根据countDownLatch线程阻塞实现
    
* @param util
    
*/
   
public void countDownLatch(ThreadUtil util){
       
ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 10,
               
0L, TimeUnit.MILLISECONDS,
               
new LinkedBlockingQueue<Runnable>());
       
final CountDownLatch latch = new CountDownLatch(3);  //设置当前线程池可并行执行的数量
       
ThreadEntiry threadEntiry = new ThreadEntiry();
       
pool.execute(new ThreadTest("A",threadEntiry,util,latch));
       
pool.execute(new ThreadTest("B",threadEntiry,util,latch));
       
pool.execute(new ThreadTest("C",threadEntiry,util,latch));
        try {
           
latch.await();
        }
catch (InterruptedException e) {
        }
finally {
           
System.out.println(threadEntiry.isThreadA()+"  "+threadEntiry.isThreadB()+"  "+threadEntiry.isThreadC());
           
pool.shutdown();
        }
    }

//线程测试类


    class ThreadTest implements  Runnable{

       
private String type;
       
private ThreadEntiry threadEntiry;
       
private ThreadUtil util;
       
private CountDownLatch latch;
       
public ThreadTest(String type,ThreadEntiry threadEntiry,ThreadUtil util) {
           
this.type = type;
           
this.threadEntiry = threadEntiry;
           
this.util = util;
        }
       
public ThreadTest(String type,ThreadEntiry threadEntiry,ThreadUtil util,CountDownLatch latch) {
           
this.type = type;
           
this.threadEntiry = threadEntiry;
           
this.util = util;
           
this.latch = latch;
        }

       
public void run() {
           
try {
               
//该实现逻辑可根据自己业务实现不同的接口
               
if ("A".equals(type)) {
                   
util.threadA();
                   
threadEntiry.setThreadA(true);
                }
else if ("B".equals(type)) {
                   
util.threadB();
                   
threadEntiry.setThreadB(true);
                }
else {
                   
util.threadC();
                    
threadEntiry.setThreadC(true);
                }
            }
catch (Exception e){

            }
finally {
               
if(latch!=null){
                   
latch.countDown();
                }
            }
        }
    }


   
class ThreadEntiry {
       
//volatile修饰,变量内存共享
       
volatile boolean threadA;
       
volatile boolean threadB;
       
volatile boolean threadC;

       
public boolean isThreadA() {
           
return threadA;
        }

       
public void setThreadA(boolean threadA) {
           
this.threadA = threadA;
        }

       
public boolean isThreadB() {
           
return threadB;
        }

       
public void setThreadB(boolean threadB) {
           
this.threadB = threadB;
        }

        
public boolean isThreadC() {
           
return threadC;
        }

       
public void setThreadC(boolean threadC) {
           
this.threadC = threadC;
        }
    }
}

 

代码运行结果

 

 

总结:分析业务接口合并使用多线程执行大大提高了效率,接口处理时间约等于最长线程执行时间

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个开源的 Java 框架,它简化了基于 Spring 的应用程序的创建和开发过程。多线程分片下载是指将一个文件分成多个小片段,并使用多个线程同时下载这些小片段,以提高下载速度。 在 Spring Boot 中,可以使用 Java多线程编程来实现多线程分片下载文件的 URL。首先,需要确定下载文件的 URL 地址,并将其分成多个小片段。然后,使用 Java多线程来同时下载这些小片段。 可以使用 Java 的线程池来管理多个下载线程,以确保并发执行,并且不会过多地消耗系统资源。可以使用 ExecutorService 接口来创建和管理线程池,并使用它的 submit() 方法来提交下载任务。 在每个下载线程中,可以使用 HttpURLConnection 或 HttpClient 等工具来发送 HTTP 请求,并将下载的文件片段保存到本地。可以使用 RandomAccessFile 类来实现将下载的文件片段追加到文件末尾的功能。 在所有下载线程完成下载后,可以将下载的文件片段合并成完整的文件。可以使用 RandomAccessFile 类来打开下载的文件,并使用它的 seek() 方法将文件指针移动到文件末尾。然后,依次将每个下载的文件片段写入到文件中。 总的来说,使用 Spring Boot 和 Java多线程编程可以实现多线程分片下载文件的 URL。通过将文件分成多个小片段,并使用多个线程同时下载这些小片段,可以提高下载速度,并且使用线程池可以更好地管理并发执行的下载线程。最后,将下载的文件片段合并成完整的文件即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值