跳转到内容
彼岸论坛

小天管理

管理员
  • 内容数

    19565
  • 注册日期

  • 最后上线

  • 得奖次数

    4

小天管理 发表的所有内容

  1. 价格直逼松哥的中号虾。 gap10 年,感觉饭要吃不起了~
  2. Magician-Concurrent Magician-Concurrent 是一个并发编程工具包,当你需要并发执行某些代码的时候,不需要自己创建和管理线程,除此之外里面还提供了生产者与消费者模型 初始化配置 导入依赖 <dependency> <groupId>com.github.yuyenews</groupId> <artifactId>Magician-Concurrent</artifactId> <version>1.0.0</version> </dependency> 并发处理任务 MagicianConcurrent.getConcurrentTaskSync() .setTimeout(1000) // 超时时间 .setTimeUnit(TimeUnit.MILLISECONDS) // 超时时间的单位 .add(() -> { // 添加一个任务 // 在这里可以写上任务的业务逻辑 }, (result, e) -> { // 此任务处理后的回调 if(result.equals(ConcurrentTaskResultEnum.FAIL)){ // 任务失败,此时 e 里面有详细的异常信息 } else if(result.equals(ConcurrentTaskResultEnum.SUCCESS)) { // 任务成功,此时 e 是空的 } }) .add(() -> { // 添加一个任务 // 在这里可以写上任务的业务逻辑 }, (result, e) -> { // 此任务处理后的回调 if(result.equals(ConcurrentTaskResultEnum.FAIL)){ // 任务失败,此时 e 里面有详细的异常信息 } else if(result.equals(ConcurrentTaskResultEnum.SUCCESS)) { // 任务成功,此时 e 是空的 } }) .start(); 添加进去的任务会并发执行,但是在它们执行完之前,这整个代码块会同步等待在这,一直等到所有任务执行完或者超时才会继续往下走。 这里面的超时时间就是用来设置同步等待多久的。 如果设置为 0 表示一直等到所有任务完成为止 设置为大于 0 的时候,表示只等待这么久 并发处理 List ,Set 等所有 Collection 类的集合里的元素 同步执行 // 假如有一个 List 需要并发处理里面的元素 List<String> dataList = new ArrayList<>(); 每个元素并发执行 // 只需要将他传入 syncRunner 方法即可 MagicianConcurrent.getConcurrentCollectionSync() .syncRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 // List 里的元素是什么类型,这个 data 就是什么类型 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); 这个方法会将传进去的集合分成若干组,每组的大小由参数指定。 这些组会排队执行,但是每一组在执行的时候都是并发的,里面的每一个元素都会由单独的线程去处理。 需要等一组处理完了,才会处理下一组,但是有时候我们不想这么死板的等待,所以可以设置一个超时时间,超过了这个期限就不等了,直接进行下一组,所以这里的最后两个参数就是用来设置这个期限的。 每一组并发执行 // 也可以用 syncGroupRunner 方法 MagicianConcurrent.getConcurrentCollectionSync() .syncGroupRunner(dataList, data -> { // 这里可以拿到每一组的元素,进行处理 // 这个 data 就是每一组 List ,可以自己迭代处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); 这个方法会将传进去的集合分成若干组,每组的大小由参数指定。 每一组由单独的线程处理。 会一直同步等待在这里,直到所有组都处理完了才会进行下一步,但是有时候我们不想这么死板的等待,所以可以设置一个超时时间,超过了这个期限就不等了,直接执行下一步。所以这里的最后两个参数就是用来设置这个期限的。 异步执行 其实就是将上面 [同步处理] 的代码放到了一个线程里,内部处理依然是上面 [同步处理] 的逻辑,但是这整个代码块将会异步执行,不需要等在这。所以个别相同的参数就不再重复解释了。 // 假如有一个 List 需要并发处理里面的元素 List<String> dataList = new ArrayList<>(); 每个元素并发执行 // 只需要将他传入 asyncRunner 方法即可 MagicianConcurrent.ConcurrentCollectionAsync( 1, // 核心线程数 1, // 最大线程数 1, // 线程空闲时间 TimeUnit.MINUTES // 空闲时间单位 .asyncRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); ConcurrentCollectionAsync 里的参数其实就是线程池的参数,除了上面这种写法,还可以这样写。 每调用一次 asyncRunner 都会占用一个线程,而这些线程都是由一个线程池在管理。 ConcurrentCollectionAsync concurrentCollectionAsync = MagicianConcurrent.ConcurrentCollectionAsync( 1, // 核心线程数 1, // 最大线程数 1, // 线程空闲时间 TimeUnit.MINUTES // 空闲时间单位 ); concurrentCollectionAsync.asyncRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); concurrentCollectionAsync.asyncRunner(dataList2, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); concurrentCollectionAsync.asyncRunner(dataList3, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); 用这个方法可以管理线程池 // 关闭线程池 concurrentCollectionAsync.shutdown(); // 立刻关闭线程池 concurrentCollectionAsync.shutdownNow(); // 获取线程池 ThreadPoolExecutor threadPoolExecutor = concurrentCollectionAsync.getPoolExecutor(); 每一组并发执行 // 也可以用 asyncGroupRunner 方法,每个参数的具体含义可以参考文档 MagicianConcurrent.ConcurrentCollectionAsync( 1, // 核心线程数 1, // 最大线程数 1, // 线程空闲时间 TimeUnit.MINUTES // 空闲时间单位 .asyncGroupRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 同上 并发处理所有 Map 类的集合里的元素 Map 的逻辑跟 Collection 一模一样,只不过是传入的集合变成了 Map ,就不再累述了,感谢理解。 同步执行 每个元素并发执行 // 假如有一个 Map 需要并发处理里面的元素 Map<String, Object> dataMap = new HashMap<>(); // 只需要将他传入 syncRunner 方法即可 MagicianConcurrent.getConcurrentMapSync() .syncRunner(dataMap, (key, value) -> { // 这里可以拿到 Map 里的元素,进行处理 System.out.println(key); System.out.println(value); }, 10, 1, TimeUnit.MINUTES); 每一组并发执行 // 也可以用 syncGroupRunner 方法 MagicianConcurrent.getConcurrentMapSync() .syncGroupRunner(dataMap, data -> { // 这里可以拿到每一组 Map 进行处理 System.out.println(data); }, 10, 1, TimeUnit.MINUTES); 异步执行 每个元素并发执行 // 假如有一个 Map 需要并发处理里面的元素 Map<String, Object> dataMap = new HashMap<>(); // 只需要将他传入 asyncRunner 方法即可 MagicianConcurrent.getConcurrentMapAsync( 1, 1, 1, TimeUnit.MINUTES ).asyncRunner(dataMap, (key, value) -> { // 这里可以拿到 Map 里的元素,进行处理 System.out.println(key); System.out.println(value); }, 10, 1, TimeUnit.MINUTES); 每一组并发执行 // 也可以用 asyncGroupRunner 方法 MagicianConcurrent.getConcurrentMapAsync( 1, 1, 1, TimeUnit.MINUTES ).asyncGroupRunner(dataMap, data -> { // 这里可以拿到每一组 Map 进行处理 System.out.println(data); }, 10, 1, TimeUnit.MINUTES); 生产者与消费者 这是一个多对多的模型,多个生产者可以给多个消费者推送不同类型的数据, // 创建一组生产者与消费者,而这样组可以创建无限个 // 每一组的生产者都只会把数据推送给同一组的消费者 MagicianConcurrent.getProducerAndConsumerManager() .addProducer(new MagicianProducer() { // 添加一个生产者(可以添加多个) /** * 设置 ID ,必须全局唯一,默认是当前类的全名 * 如果采用默认值,可以不重写这个方法 * @return */ @Override public String getId() { return super.getId(); } /** * 设置 producer 方法是否重复执行,默认重复 * 如果采用默认值,可以不重写这个方法 * @return */ @Override public boolean getLoop() { return super.getLoop(); } /** * 设置 是否等消费者全部空闲了才继续生产下一轮数据,默认 false * 如果采用默认值,可以不重写这个方法 * @return */ @Override public boolean getAllFree() { return super.getAllFree(); } /** * 当生产者启动后,会自动执行这个方法,我们可以在这个方法里生产数据,并通过 publish 方法发布给消费者 * * 这边举一个例子 * 假如我们需要不断地扫描某张表,根据里面的数据状态去执行一些业务逻辑 * 那么我们可以在这个方法里写一个查询的逻辑,然后将查询到数据发送给消费者 */ @Override public void producer() { // 根据上面的例子,我们可以查询这张表里符合条件的数据 List<Object> dataList = selectList(); // 然后将他推送给消费者 // 可以推送任意类型的数据 this.publish(dataList); /* * 如果你只需要执行一次,那么到此就结束了,这个生产者也可以被回收掉了 * * 但是如果你需要不断地执行上述操作,来维护这张表里的数据,这个时候你有两种做法 * 第一种:加一个 while 循环 * 但是这种方式有个问题,如果消费者的消费速度跟不上,那么就很容易造成消费者队列积压,出现内存问题。 * 而数据积压太久又会影响时效性,可能你推送给消费者的时候,这条数据需要处理,但是等到被消费的时候又不需要处理了,这样容易出现数据错乱的问题。 * * 第二种:等消费者把你推给他的数据消费完了,再推送下一轮,而我们就是采用的这种 * 如果你想用这种方式,那么你不需要再写其他的任何逻辑,只需要将上面提到的 getLoop 方法重写一下,并返回 true 即可 * 当你设置为 true 以后,生产者在推送完一轮后会不断地监视消费者,当发现了空闲的消费者才会推送下一轮数据,并且数据只会推送给这个空闲的消费者 * * 如果你想等所有消费者都空闲了以后再推送下一轮,而不是发现一个空闲的就推送一轮 * 那么你可以重写上面提到的 getAllFree 方法,返回 true 即可 */ } }) .addConsumer(new MagicianConsumer() { // 添加一个消费者,可以添加多个 /** * 设置 ID ,必须全局唯一,默认是当前类的全名 * 如果采用默认值,可以不重写这个方法 * @return */ @Override public String getId() { return super.getId(); } /** * 心跳通知,消费者每消费一个任务,都会触发一下这个方法 * 我们可以根据他触发的频率来判断这个消费者的活跃度 * * 注意!!! * 这个方法里不可以有耗时的操作,不然会将消费者阻塞的 * 如果一定要加耗时的操作,那么务必在新线程里搞 * @param id */ @Override public void pulse(String id) { new Thread(()->{ // 如果你需要在这个方法里搞一些耗时的操作,那么务必要像这样开启一个新线程 // 不然消费者会被阻塞的 }).start(); } /** * 消费频率限制,默认 10 毫秒,取值范围:0 - long 的最大值,单位:毫秒 * * 如果任务执行的耗时小于 execFrequencyLimit ,则等待 execFrequencyLimit 毫秒后再消费下一个任务 * * 首先这是一个生产者和消费者多对多的模型结构,我们以一个生产者对多个消费者来举例 * 生产者生产的数据只有一份,但是他会推送给多个消费者 * 而我们之所以要配置多个消费者,是因为需要他们执行不同的业务逻辑 * 多个消费者执行的业务逻辑不同,也就意味着他们需要的数据大概率会不同 * * 比如消费者 A 需要处理男性的数据,消费者 B 需要处理女性的数据 * 如果生产者刚好连续推送了几批男性的数据,那么这会导致消费者 B 筛选不到女性数据,那么他就不会处理业务逻辑了 * 这么一来,消费者 B 就会无限接近空转,而空转会引起 CPU 占用率过大,所以必须加以限制 * * 千万不要小看这个问题,本人曾经在实战中亲测过,做不做这个限制,CPU 的占有率会达到 10 倍的差距 * 当然了,这跟消费者的业务逻辑还是有一定关系的,具体情况具体看待 * 如果你的消费者几乎不会出现空转,那么这里可以设置为 0 * */ @Override public long getExecFrequencyLimit() { return super.getExecFrequencyLimit(); } /** * 这个方法会接收到生产者推送过来的数据 * 在里面执行相应的业务逻辑即可 * @param data */ @Override public void doRunner(Object data) { // data 可以是任何类型 // 因为能给他推送数据的消费者是固定的,所以 data 有可能收到的类型也是固定的 // 所以我们可以在这里自己判断,然后转化即可 // 为什么不用泛型?这是为了兼容多个生产者,因为他们推送的数据类型可能会不同 } }) .start(); } 项目官网:https://magician-io.com
  3. 什么牌子的剃须刀好用,现在用的手动剃须刀,1-2 次就得换刀片, 太不耐用了
  4. claude 3.5 sonnet 有多强?我把 github.com/suniw/fhash 这个仓库地址扔给模型,(c++)源码,让它帮我翻译成 xcode 代码。一次成功,我没增改一行代码,程序员你慌不慌? 效果展示 https://i.imgur.com/Ae6jryg.mp4 佩服佩服!!!!
  5. RealtimeAPI - 像人类一样与 AI 实时交谈 https://realtimeapi.net/
  6. 昨天也没剧烈运动 纯粹是骑车的时候蹬用力点,骑车一小时左右,今天起床神清气爽(不排除是放假的心理因素)。大家快运动起来吧,摆脱亚健康
  7. 功能简单点都无所谓 源码齐全开箱即用 包部署 方便二开的就好
  8. 有没有能够跳过带有商品介绍回答的插件。 旧版网页或者第三方的浏览器会不会有这个功能,不太像每次都看折叠一些利益相关的回答
  9. 有点点想收台三星来玩玩 日常往返中欧,因此对 NFC 的需求是:在欧洲绑当地 VISA/Mastercard 银行卡日常消费,在国内用来刷交通卡。再加个 NFC 模拟门禁的需求。 不知道 Samsung Pay 分不分地区,国内交通卡和 VISA/Mastercard 以及 NFC 模拟能否共存?以及这些跟机器硬件地区版本和系统地区版本有没有关系?
  10. 完整的报错内容如下所示: 2024-10-02 01:15:19.714 ERROR 29348 --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'reqEnvContextFilterRegistrationBean' defined in class path resource [com/example/common/core/CommonCoreConfiguration.class]: Unsatisfied dependency expressed through method 'reqEnvContextFilterRegistrationBean' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reqEnvContextFilter': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sys.app-name' in value "${sys.app-name}" 这个问题显然是因为无法解析出 sys.app-name 的值导致的,然而奇怪就奇怪在这个值我很明确我已经设置过了,在 application.properties 中,有下面的配置 sys.app-name=demo sys.ms-name=demo 按说是不该出现这个问题的,但是却会报这个问题 我的项目中并没有直接使用 sys.app-name 这个值,但由于这个是我公司的 demo 项目,内部的公司依赖可能在某处解析了该值,只是我不知道而已,我没法通过不使用该值或者给他一个默认值的方法来解决这个问题 我使用的 jdk 版本为 8 ,maven 版本为 3.5.3 搜索引擎上的方法我基本都尝试过了,都无法解决该问题,我实在没法了所以我来这问问各位,希望有大佬能救一下
  11. 启用了三指拖移,用 mac 触控板三指操作有的时候是进行拖拽 有的时候是多选,很随机,所以如果想要进行选择多个文件,触控板的具体手指操作是什么?(在不按住 command 的的情况下)
  12. 虽然现在也还是一个老韭菜,但我还是想说说自己心路历程。 19 年中入场购买基金,时机还算不错,最初是抱着重在参与的心态,选择了每天几十块钱的定投模式。 20 年股市开始上涨,看着账号收益不断创新高,虽然总收益不过一千,但是躺着赚钱的感觉很好。 当时关注着各种小道消息,想知道明天是涨还是跌,能涨到多少点。 中间出现波动调整时害怕收益清零都会选择下车。这时候的策略是小资金定投入场,出现波动就全清。 自我感觉股市真能赚到钱,而且还不费力,定投就好了,开始各种在好友面前晒收益秀操作,对于自己关于股市的认知各种自信,在好友群中各种指点江山。 得益于当时行情确实不错,每轮调整完了以后都能涨回去,让我误以为反正都会涨回去的。所以定投的金额开始加大,涨得好的时候还会额外追加资金,害怕错过了上车机会而损失一大笔收益,胆子也越来越大,这样的想法让我在 21 年出现比较大调整的时候还是一直在保持定投。 这个时候心态上已经发生了变化,变得不愿意卖出了,觉得卖出会是一种损失,虽然知道现在也很高了,停了定投,但是我要等下一个更高点的到来,看着基金账户中浮盈的金额满心欢喜。 时间来到 21 年 12 月份,股市开始大幅下跌,此时我的心态还是和之前一样,反正都会涨回来的。在下跌过程中还在不停地补仓,但是这次股市没有再涨回来,直到今天也还有 45%的亏损。 我觉得每一轮牛市入场的新人,一开始是很容易赚到钱的。但是要么投入不高,要么卖点不对,绝大多数都会带着更多的资金重返股市,而这个时候才是亏损的开始。 起初股市送了你一笔学费,你不选择去学好相关知识,那就只能让你多交点学费了。 附上自己其中一张基金买卖的截图。
  13. 公司有个海外区块链长期金融项目(职位), 选中我做人才培养储备, 征询我的意见. 我的感觉是现在区块链好像没人提了, 不知未来发展如何, 请业内人士指点现在学区块链 blockchain 的话, 将来有(钱)前景吗? 谢谢
  14. 如上图,都是 pdf ,但大小不一样?
  15. Google 搜了下有好多家。奈飞小铺、奈飞 Pro 之类的。不知道靠不靠谱
  16. 有人安装了吗?和 Pro 比起来怎么样?
  17. 价格 3000-5000 的最好,别太贵了 刚下楼去单位操场跑了个 10k 但是太冷了现在,准备以后改成中午跑或者室内跑步机 于是如题
  18. 最惨的还是今年的大学毕业生,毕业即失业。根据国家统计局 9 月下旬最新发布的数据显示,2024 年 8 月 24 岁及以下年轻群体失业率 18.8%,为历史最高。也就是说 10 个人有两个是找不到工作的,如果加上送外卖这些“灵活就业”的年轻人,估计这个比例更高。 2024 接近尾声,希望 2025 经济能好点。 未雨绸缪,关于明年的发展和未来的计划,V 友们都有什么看法?
  19. 12 代 i3 (不带集显) + 6600XT 组了一台 Windows + 黑果双系统,macOS 日常使用和写代码,Win11 只装了 Steam 和不到 10 个软件,基本就是打游戏专用。然后几乎每次切到 Windows 下几乎都会碰到经典 A 卡掉驱动的情况: 显卡风扇停转 显示器黑屏 键盘断连 (点击 Caps 键,指示灯不会变化) 不过我自己的情况好像和 B 站还有贴吧网友碰到的情况不太一样,大部分 A 卡玩家都是:打游戏时显卡突然黑屏掉驱动,而我游戏却异常的稳,只要进游戏哪怕显卡占用率 90%以上或者接近满载,温度升到 80°C 多,也是一次都没碰到过。但是日常轻度使用如浏览网页或者退出游戏一段时间后却会突然黑屏掉驱动 🥲(装了 GitHub 那个温度检测插件,观察到日常使用显卡温度和 CPU 温度在 40°C 左右,占用率 0 或者不到 5%)。另外就是 macOS 也挺稳定的,也是一次没碰到,即便短时间离开电脑,系统自动休眠,机箱部分风扇停转,此时点点鼠标唤醒系统,也没出现过掉驱动的情况。 现在不确定我这种情况是否可以称之为“掉驱动”,或者只是“死机”了?卡体质应该没问题,虽然没做过双烤之类的。 装的是某个 Win11 精简系统,不确定是否系统镜像的锅。PE 那个 U 盘只有 8G 用了很多年,原版镜像放不下。 等下再找个 U 盘重做一下 PE ,用原版镜像试试看。 不知道有无在使用 A 卡的 v 友,说下经验。
  20. 起因:ubuntu 开机时,提示 initramfs ,叫我手动修复 操作:我执行了 fsck.ext4 -yf /dev/sda2 ,先开始扫出很多 block ,询问修复。 现状:后来没管它,时间久了,就全屏无限滚动字母 y ,如下示意: y y y y y y y y y y y| ( y 和光标在这里闪) 搜了下网上好像没遇到我这样的显示。 请问: 现在这是在正常修复中吗?快刷一整天了。我是不是继续等着就完事儿了? Ctrl+C 可以中止修复吗?或者有没有其它无风险中止方法,好让我挂载到其它电脑备份下数据。
  21. 美股一直跌,大 A 港股猛涨,心好痛。
  22. 每次卸载之后 重装都发现之前的账户登录信息貌似都存在手机里面
  23. 一人只能说一句 我先来: 「我对面的同事喜欢穿拖鞋上班,夏天脚特别臭,我多次想吐🤮」
  24. 这是一个简单的插件,帮助你在完成你的知识库的同时可以快速的翻译陌生的单词或句子,并将其生成单词卡插入笔记本中。此外,你还可以将翻译引擎的发音文件保存到你的 vault ,如果你想,你也可以录制自己的发音。 Obsidian 插件连接:obsidian://show-plugin?id=dictionary-translator Github 连接: https://github.com/grover572/obsidian-Dictionary-translator 我能做什么 划词翻译 学习单词发音 录制你的发音 添加到笔记并创建内部链接 已支持的翻译引擎 有道翻译 百度智能云词典翻译
×
×
  • 创建新的...