当前位置: 首页 > news >正文

怎么用polylang做网站菜单wordpress淘宝组件插件

怎么用polylang做网站菜单,wordpress淘宝组件插件,wordpress lens 模板币,公司黄页是指什么意思一、协程是什么#xff1f; 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的#xff0c;JVM只是在上层进行了API的封装#xff0c;包含常见的有线程的启动方法#xff0c;状态的管理#xff0c;比如#xff1a;Java中抽象出了6种状态#x…一、协程是什么 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的JVM只是在上层进行了API的封装包含常见的有线程的启动方法状态的管理比如Java中抽象出了6种状态提供了start方法用于启动线程。     但是线程一旦调用start()开始执行那我们是很难再控制线程的停止的尽管jdk中提供了suspend()方法但是suspend也只是做了标记线程需要中断最终是否中断什么时候中断还是依赖操作系统的具体实现逻辑从语言层面来说是无法直接控制的。 // java线程的状态定义在Java$State枚举对象中 public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread. A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from the operating system* such as processor.*/RUNNABLE,/*** Thread state for a thread blocked waiting for a monitor lock.* A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized block/method after calling* {link Object#wait() Object.wait}.*/BLOCKED,/*** Thread state for a waiting thread.* A thread is in the waiting state due to calling one of the* following methods:* ul* li{link Object#wait() Object.wait} with no timeout/li* li{link #join() Thread.join} with no timeout/li* li{link LockSupport#park() LockSupport.park}/li* /ul** pA thread in the waiting state is waiting for another thread to* perform a particular action.** For example, a thread that has called {code Object.wait()}* on an object is waiting for another thread to call* {code Object.notify()} or {code Object.notifyAll()} on* that object. A thread that has called {code Thread.join()}* is waiting for a specified thread to terminate.*/WAITING,/*** Thread state for a waiting thread with a specified waiting time.* A thread is in the timed waiting state due to calling one of* the following methods with a specified positive waiting time:* ul* li{link #sleep Thread.sleep}/li* li{link Object#wait(long) Object.wait} with timeout/li* li{link #join(long) Thread.join} with timeout/li* li{link LockSupport#parkNanos LockSupport.parkNanos}/li* li{link LockSupport#parkUntil LockSupport.parkUntil}/li* /ul*/TIMED_WAITING,/*** Thread state for a terminated thread.* The thread has completed execution.*/TERMINATED;}而协程内的代码依然执行在线程上因为线程是CPU调度的基本单元这个大前提还是不变的属于操作系统层面的基本概念了。但是协程通过使用状态机的方式在语言层面上实现了一种状态、生命周期更易管控的代码逻辑调度框架语言层面的框架也可以理解为轻量级线程并且不像线程那样直接使用操作系统实现的线程一旦启动基本就只能等任务执行结束或请求中断待能中断时才停止运行。 1.2 协程和线程、进程的关系 启动一个线程执行任务 val task1 Thread {val result requestUserInfo()println(task1 finished, result $result) } task1.start()启动一个协程执行任务 val task1 launch {val result requestUserInfo()println(task1 finished, result $result) } // requestUserInfo()需要切换协程运行的线程需要增加suspend修饰 // 定义成挂起函数 suspend fun requestUserInfo(): UserInfo withContext(Dispatchers.IO) {delay(500)returnwithContext UserInfo(10000, zhangsan) }总结一下协程和线程的区别 线程一旦开始执行就不会暂停直到任务结束这个过程是连续的协程能够自己挂起和恢复语言层面实现了挂起和恢复流程能够实现协作式调度 1.3 使用协程的关键API 1.3.1 协程作用域CoroutineScope 创建协程或调用挂起函数必须有协程作用域kotlin创建作用域有三种办法GlobalScope、runBlocking和CoroutineScope()方法。 Android中提供的协程作用域有 MainScope() lifecycleScope lifecycleScope中的协程会在Activity销毁时执行cancel viewModelScope 1.3.2 协程对象Job public interface Job : CoroutineContext.Element {// 注1public companion object Key : CoroutineContext.KeyJob// 如果协程还未启动比如传入的start对象是LAZY可通过主动调用// start方法启动协程public fun start(): Boolean// 注2public fun cancel(cause: CancellationException? null)// 当前协程的子协程public val children: SequenceJob// 附加子协程使当前协程对象成为父协程InternalCoroutinesApipublic fun attachChild(child: ChildJob): ChildHandle// 等待当前协程执行完成比如调用协程的cancel()方法后调用join()// 就是等待协程cancel执行完成public suspend fun join()// 注册在取消或完成此作业时 同步 调用一次的处理程序public fun invokeOnCompletion(handler: CompletionHandler): DisposableHandleInternalCoroutinesApipublic fun invokeOnCompletion(onCancelling: Boolean false,invokeImmediately: Boolean true,handler: CompletionHandler): DisposableHandle }1Key : 声明成伴生对象后只要是同一种类型的Job创建出来的不同Job实例key都是相同的也就是同类型的Job对象key也相同2cancel(): 取消协程 1.3.3 协程上下文CoroutineContext 存放协程相关的一些信息 1.3.4 协程调度器CoroutineDispatcher Dispatchers.Main: Android中特有的在主线程中执行协程代码其他平台使用会抛出异常Dispatchers.IO: 用于IO密集型的协程任务Dispatchers.Default: 用于CPU密集型的协程任务Dispathcers.Unconfined: 不指定协程执行的线程调度器 二、协程在Android中的常见用法 2.1 子线程中执行耗时任务后切到主线程更新UI // 场景1: 在子线程中执行耗时任务后切到主线程处理 coroutineScope.launch {// 挂起函数执行时从当前线程中脱离执行在dispatcher执行的线程中执行完毕后再切换原来的线程中// 挂起后当前协程下一行代码会等待挂起函数执行完成val result withContext(Dispatchers.IO) {// 在Dispatchers.IO线程调度器指定的子线程中执行下面的代码delay(5000)100}Log.d(TAG, onCreate: main 2 $coroutineContext)binding.tvNews.text result.toString() }上面的用法对于Android来说协程是一个异步代码执行框架相比于ThreadHandler的方式更加简洁省去了开发者编写线程切换代码的工作。 2.2 多个耗时任务并行执行合并结果【常见的业务模型】 在Android业务中我们经常需要并行开始多个业务接口请求然后合并成一个结果进行后续业务逻辑的判断、UI的展示使用Jdk提供的CountDownLatchRxJava的zip都可以实现类似的功能逻辑。 如下展示了kotlin在这个业务模型中如何实现 coroutineScope.launch {// 在Dispatchers.IO执行的线程中执行任务1val async1Result async(Dispatchers.IO) {Log.d(TAG, onCreate: async1 $coroutineContext)executeTask1()}// 在Dispatchers.IO执行的线程中执行任务2val async2Result async(Dispatchers.IO) {Log.d(TAG, onCreate: async2 $coroutineContext)executeTask2()}// 在调用async方法之后两个协程任务都已经并行跑起来了这时候调用await方法等待执行结果val result async1Result.await() async2Result.await()Log.d(TAG, onCreate: async result $result) }kotlin中使用async实现类似java中Callable的协程任务但是await方法阻塞等待结果并没有提供超时时间的参数async()方法是创建一个可获取返回值的协程对象类型是Deferred继承自Job 三、挂起函数的理解 3.1 挂起函数的本质 协程的核心是函数或一段程序能够支持挂起执行完成后又从挂起位置恢复然后继续执行后面的代码。kotlin的是借助线程实现的是对线程的一个封装框架通过launch、async启动一个协程其实就是启动一个闭包中的代码块。当执行到suspend函数时暂时不执行协程代码了而是从当前线程中脱离函数内的逻辑转到协程调度器所指定的线程中去执行等到挂起函数执行完毕后又恢复都挂起的位置继续执行后续逻辑 所以总结来说挂起函数就是切到别的线程稍后又能够自动切回来的线程调度操作。 3.2 为什么挂起函数一定要在协程或挂起函数中调用 挂起函数切到调度器线程中后是需要协程框架主动调用resumeWith方法再切回来的如果在非协程非挂起函数调用那么就没有协程环境无法切回来就无法实现挂起的执行逻辑。 四、协程的取消 协程提供了cancel方法进行取消。 class Job {public fun cancel(cause: CancellationException? null) }cancel()方法其实还有另外两个重载方法但是打上了Deprecated注解所以不再使用了。 五、协程并发数据同步问题 在java中多线程访问共享变量时因为有主内存和工作内存模型的设计。 class Test {private var count 0private val mutex Mutex()suspend fun test() withContext(Dispatchers.IO) {repeat(100) {launch {repeat(1000) {count}}}launch {delay(3000)println(finished---- count $count)}} }fun main(): Unit runBlocking {runBlocking {Test().test()} }输出结果 finished---- count 97861如上代码在循环中创建100个协程每个协程中对count变量累加1000次最终count的值应该是100000但是输出是97861存在并发修改数据不一致问题。 在Java线程中我们可以采用sychronized或ReentrantLock方式进程多线程同步处理保证最终数据的正确性。
http://www.zqtcl.cn/news/344548/

相关文章:

  • 佛山制作手机网站莆田自助建站软件
  • 建邺做网站价格网站做换肤
  • 佛山有什么网站室内装饰设计怎么样
  • 智能建站与正常的网站购买 做网站 客户
  • 哪个是网络营销导向网站建设的基础微信商城开店需要费用吗
  • 宁波住房和建设局网站首页福州有做网站引流的吗
  • 国外科技类网站戴尔网站建设
  • 视频播放网站模板洞泾做网站公司
  • 深圳大学网站建设中美军事最新消息
  • gta5可用手机网站大全佛山网站建设服务
  • 智能建站软件哪个好智慧城市建设评价网站
  • 做网站用什么配资电脑织梦做的网站织梦修改网页模板
  • 手机网站制作吧网店营销策略
  • 管理员修改网站的参数会对网站的搜效果产生什么影响?网站建设新闻+常识
  • WordPress主题没有删除网站优化 工具
  • 建设外贸商城网站制作外国网站域名在哪查
  • 青浦练塘网站建设关键词优化的策略有哪些
  • 做网站链接怎么弄上海万户网络技术有限公司
  • 嵌入字体的网站网站结构和布局区别
  • 莆田网站建设五维网络有限公司零基础网站开发要学多久
  • 重庆官方网站查询系统2020最近的新闻大事10条
  • 中国网站建设公司排行榜成都彩票网站建设
  • 网站域名解析失败个人推广网站
  • 东莞网站建设网络公司排名卓业网站建设
  • 建立自己的网站平台的好处高校英文网站建设
  • 大力推进网站集约化建设兰州优秀网站推广
  • 手机wap网站怎样从微信公众号打开辽宁省住房和城乡建设厅网站上不去
  • 网站建设备案 优帮云四川建设设计公司网站
  • dede网站搬家 空间转移的方法网站建设多少钱一个平台
  • 山东济南网站开发互联网创业项目哪家好平台