首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot4],共10000篇文章
优秀的个人博客,低调大师

4.JUC线程高级-CountDownLatch 闭锁

Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。 1. CountDownLatch 闭锁 CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 闭锁可以延迟线程的进度直到其达到终止状态 闭锁可以用来确保某些活动直到其他活动都完成之后才继续执行: a) 确保某个计算在其需要的所有资源都被初始化之后才继续执行; b) 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; c) 等待直到某个操作所有参与制都准备就绪在继续执行。 比如:统计下多个线程执行完毕之后的总耗时: package com.pyy.juc; import java.util.concurrent.CountDownLatch; public class TestCountDownLatch { public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(5); LatchDemo ld = new LatchDemo(latch); long start = System.currentTimeMillis(); for(int i = 0; i < 10; i++) { new Thread(ld).start(); } try { // 等待 countdown为0 latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("总耗时:" + (end - start)); } } class LatchDemo implements Runnable { private CountDownLatch latch; public LatchDemo(CountDownLatch latch) { this.latch = latch; } @Override public void run() { synchronized (this) { try { for (int i = 0; i < 5000; i++) { if(i % 2 == 0) { System.out.println(i); } } } finally { // 计数器减一 latch.countDown(); } } } } 2. FutureTask FutureTask相信大家也不陌生了,它是一种闭锁。FutureTask表示的任务是通过一个类实现Callable接口实现的,相当于一种有结果的Runnable,并且可以抛出异常。FutureTask可以处于下面三种状态:等待运行、正在运行、运行完成。执行完成状态表示该任务所有可能结束的方式:包括正常结束、抛出异常、任务中途取消。FutureTask一般与多线程管理工具Executor配合使用。 FutureTask实例的get行为取决于任务的状态。如果任务已完成,则返回结果;如果该任务正在执行,则get方法会一直阻塞直到完成、抛出异常。

优秀的个人博客,低调大师

swift4,网络请求工具Moya

在OC中,我们使用AFNetworking来进行网络请求,简洁方便。在swift中,我们使用Moya来进行网络请求,Moya封装了Alamofire,可以更加方便的进行网络请求。初次使用Moya,还是觉得稍稍有些不习惯。在这里,记录下使用过程。 一、新建项目,新建cocoapod,导入Moya库。 platform :ios, '9.0' inhibit_all_warnings! target 'IJKPlayerDemo' do use_frameworks! pod 'Moya' end 导入之后,我们发现项目中多了几个文件: image.png 这就是Moya的库文件了。 二、新建三个文件,当然了,放在一个文件里也是可以的。不过,放在三个文件里是为了更加清晰和方便管理。 image.png NetService.swift // // NetService.swift // IJKPlayerDemo // // Created by iOS on 2018/5/28. // Copyright © 2018年 weiman. All rights reserved. // import UIKit enum NetService { /// 直播列表数据 case liveList } 这个文件是存储接口的名称的,也就是每一个网络请求都会有一个自定义的名字,类似于函数的声明。这里要把参数也要写全。 NetService+Extension.swift // // NetService+Extension.swift // IJKPlayerDemo // // Created by iOS on 2018/5/28. // Copyright © 2018年 weiman. All rights reserved. // import UIKit import Moya /// NetService的扩展,记得一定要遵循TargetType协议。 extension NetService: TargetType { // 根路径,一般放域名 var baseURL: URL { return URL(string: "http://www.mocky.io/v2")! } // 具体路径,每一个网络请求的具体路径部分 var path: String { switch self { case .liveList: return "5b0cc5153300005200b400aa" } } // 请求方式,get还是post var method: Moya.Method { switch self { case .liveList: return .get } } // 参数 var task: Task { switch self { case .liveList: let param = ["t" : "\(Date().timeIntervalSince1970)"] return .requestCompositeData(bodyData: Data(), urlParameters: param) } } // 暂时不知道干啥的 var sampleData: Data { switch self { default: return Data() } } //这个应该是请求的类型头 var headers: [String: String]? { return ["Content-type": "application/json"] } } //MARK: - Helpers private extension String { var urlEscaped: String { return addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! } var utf8Encoded: Data { return data(using: .utf8)! } } extension Task { static func json(_ parameters: [String: Any]) -> Task { return .requestParameters( parameters: parameters, encoding: JSONEncoding.default ) } } 这是NetService的扩展,你也可以写在一个文件中。不过,为了区分,就把网络请求名称列表和公共“实现”部分分开了写。 API.swift // // API.swift // IJKPlayerDemo // // Created by iOS on 2018/5/28. // Copyright © 2018年 weiman. All rights reserved. // import UIKit import Moya let provider = MoyaProvider<NetService>() 这样,基本的网络请求基础部分已经搭建完了,剩下的就是使用了。 三、开始请求 我在这里又新建了一个用于网络请求的文件:LoadDataHelper // // LoadDataHelper.swift // IJKPlayerDemo // // Created by iOS on 2018/5/28. // Copyright © 2018年 weiman. All rights reserved. // import UIKit import Moya enum LoadDataHelper { static func loadData(success: @escaping (_ data: Data) -> Void) { provider.request(.liveList) { (result) in switch result { case .success(let value): do { let data = value.data let dataAsJSON = try JSONSerialization.jsonObject(with: data) let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted) success(prettyData) } catch { } case .failure(let error): print("--请求失败-- \(error)") } } } } 四、vc中使用 // // ViewController.swift // IJKPlayerDemo // // Created by iOS on 2018/5/28. // Copyright © 2018年 weiman. All rights reserved. // import UIKit import Foundation import IJKMediaFramework class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() loadData() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func loadData() { LoadDataHelper.loadData { (data) in do { let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) print("--------- \(json)") } catch { } } } } 结果截取部分: image.png

优秀的个人博客,低调大师

Java-学习笔记-4-抽象

不足之处,欢迎专家、同行、读者批评指正。 上一篇在说类库文件时提到了封装,不够严谨,这一篇来简单讲讲。 抽象和封装,这是面向对象程序设计中的一个重要思想。换句话说,是思维方式的转变。以前我们编程,是围绕某一个问题的,研究它的过程是怎样的。现在嘛,是考虑不同的对象之间的信息传递,更适合来写不同对象交互信息的业务。 先说说抽象。最关键的在于属性和功能。举个例子吧,比如说现在你要去图书馆借书,那对你来说,你的属性就是个人ID,借阅权限,借了几本书等等,图书馆那边对象很多,比如说管理员、书等等。你们之间的业务往来,就可以看作功能。 更直白点说,属性通常就是信息的那个值,编程时我们写成int的这种,所谓的功能就是对这个值进行操作的函数或者说方法。当然啦,一个类之中嵌套另一个类,并且把里边的那个类看做是成员变量,这种情况也是有的,不过在理解含义时可以把它和上文的“值”看作一回事。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册