首页 > 其他分享 >【面试系列5】JUC

【面试系列5】JUC

时间:2023-05-23 16:55:04浏览次数:46  
标签:JUC 系列 String System 面试 println new public out

并行与并发

并行:多个机器同时执行
并发:一个机器分时执行

Future接口

定义了操作异步任务执行的一些方法,获取异步任务执行的结果,取消任务的执行,判断任务是否被取消,判断任务执行完毕。
多线程/有返回/异步任务

class MyThread2 implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("execute");
        return "hello";
    }
}

public class aa {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask futureTask=new FutureTask(new MyThread2());
        System.out.println(futureTask.isDone());
        futureTask.run();
        System.out.println(futureTask.isDone());
        System.out.println(futureTask.get());

    }
}

使用线程池


public class FutureThreadPool {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

        Long startTime=System.currentTimeMillis();
        FutureTask<String> futureTask1 = new FutureTask<>(() -> {
            try {
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "futureTask1 success";
        });
        threadPool.submit(futureTask1);
        FutureTask<String> futureTask2 = new FutureTask<>(() -> {
            try {
                TimeUnit.MILLISECONDS.sleep(300);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "futureTask1 success";
        });
        threadPool.submit(futureTask2);
        try {
            TimeUnit.MILLISECONDS.sleep(300);
        } catch (Exception e) {
            e.printStackTrace();
        }
        futureTask1.get();
        futureTask2.get();
        Long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);
        threadPool.shutdown();

    }
}

问题:

  1. 假如果get放在主线程前面,会阻塞主线程。
    get(long time,TimeUnit unit)
    超时便抛出异常

  2. 轮询会导致CPU空转。
    while(!futureTask.isDone()){
    }
    futureTask1.get();

注意:回调通知,便不需要轮询。

使用CompletableFuture,异步回调。

public class CompletableFutureTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            return "hello";
        }, threadPool);
        System.out.println(completableFuture.get());
    }
}
public class CompletableFutureTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

        CompletableFuture<String> step1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("step1 come in");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("step1 run end");
            return "step1";
        },threadPool).whenComplete((v, e) -> {
            if (e == null) {
                System.out.println("步骤1 结束");
                step2();
            }
        }).exceptionally(e -> {
            e.printStackTrace();
            return null;
        });
        System.out.println("主线程");



    }

    private static void step2() {
        CompletableFuture<String> comeIn = CompletableFuture.supplyAsync(() -> {
            System.out.println("step2 come in");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("step2 run end");
            return "step2";
        });
        try {
            System.out.println(comeIn.get());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    }
}

电商比价需求:

public class MallTest {

    static List<NetMall> list = Arrays.asList(new NetMall("jd"), new NetMall("dd"), new NetMall("tb"));

    //public static List<String> getPrice(List<NetMall> list, String product) {
    //    return list.stream().map(netMall -> product + " in " + netMall.getNetMall() + " " + netMall.getPrice(product)).collect(Collectors.toList());
    //}
    public static List<String> getPrice(List<NetMall> list, String product) {
        return list.stream()
                .map(netMall -> CompletableFuture.supplyAsync(() -> product + " in " + netMall.getNetMall() + " " + netMall.calPrice(product)))
                .collect(Collectors.toList())
                .stream()
                .map(t->t.join())
                .collect(Collectors.toList());
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long startTime = System.currentTimeMillis();
        List<String> list1 = getPrice(list, "mysql");
        for (String s : list1) {
            System.out.println(s);
        }

        long endTime = System.currentTimeMillis();
        System.out.println("执行时间:" + (endTime - startTime));
    }
}

@Data
@AllArgsConstructor
class NetMall {
    private String netMall;

    public BigDecimal calPrice(String productName) {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return BigDecimal.valueOf(ThreadLocalRandom.current().nextDouble() * 2 + productName.charAt(0));
    }
}

https://blog.csdn.net/dolpin_ink/article/details/125116590

标签:JUC,系列,String,System,面试,println,new,public,out
From: https://www.cnblogs.com/handsometaoa/p/17420793.html

相关文章

  • JFrog Artifactory 系列5 --- 备份和还原
    一、概要1.承上启下JFrogArtifactory系列1---安装与配置JFrogArtifactory系列2---Nginx与HttpsJFrogArtifactory系列3---仓库与配置JFrogArtifactory系列4---Maven的配置与集成二、备份1.备份配置JFrog Artifactory自带自动备份的功能,并且可以通过页面......
  • iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型
    iOSMachineLearning系列(17)——几个常用的对象识别CoreML模型上一篇文章中,我们介绍了几个官方的图片分类的模型,图片分类模型的应用场景在于将图片中最主要的事物进行识别,在已有的词库中找到最可能得事物。而对象识别则要更高级一些。再之前的文章,我们介绍过可以使用官方提供的......
  • #yyds干货盘点# LeetCode程序员面试金典:平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]......
  • #yyds干货盘点# LeetCode程序员面试金典:分数到小数
    1.简述:给定两个整数,分别表示分数的分子 numerator和分母denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回任意一个。对于所有给定的输入,保证答案字符串的长度小于104。 示例1:输入:numerator=1,denominat......
  • 【面试系列6】Redis
    redisredis是什么?内存数据库,一切数据操作都在内存中进行,所以速度很快,常被用来做缓存,消息队列,分布式锁。具有高效的数据结构,String、list、hash、set、zset,bitmaps、hyperloglog、geo、stream。redis还支持事务、持久化、多种集群方式、发布订阅模型、内存淘汰机制等等。re......
  • 这可能是最全面的MySQL面试八股文了
    什么是MySQLMySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。数据库的三大范式第一范式1NF确保数据库表字段......
  • 前端学习 node 快速入门 系列 —— 事件循环
    事件循环本篇将对以下问题进行讨论:浏览器有事件循环,node也有事件循环,两者有什么异同?node核心特性(事件驱动和非阻塞I/O)和事件循环有什么关系?node中的高并发和高性能和事件循环有关系吗?node不适合什么场景?有人说Node是单线程,有人又说node存在多线程,哪个正确?如果一......
  • 经纬恒润新产品系列 | 行泊车一体产品家族
        随着自动驾驶功能的普及,整车E/E架构由分布式向集中式的演进和升级,加上行车功能和泊车功能在执行端的共用性,以及传感器端的部分可复用,行泊车一体化域控制器方案能够大大减少项目开发与集成的复杂程度,已被越来越被客户所接受和认可。     凭借多年L2量产经验,经......
  • 经纬恒润新产品系列 | 这款AR-HUD将颠覆你的认知
        随着科技的发展与突破,智能化产品在汽车领域扮演了越来越重要的角色。本文即将介绍经纬恒润新产品——AR-HUD(增强现实抬头显示系统),它可以将科幻电影中的驾驶场景变为现实——将信息投影在挡风玻璃上,基于此功能,AR-HUD还可以标记路况、天气、温度等信息,这将极大地提高驾驶......
  • xiaofeng.NET系列之 netcore c#快速导出数据CSV格式 winfrom wpf
    一个导出buttonnuget搜索 usingXiaoFeng.IO;usingXiaoFeng; privatevoidbutton1_Click(objectsender,EventArgse){varsavedlg=newFolderBrowserDialog(){Description="选择保存的路径",......