【转】Win10 LTSC 恢复照片查看器

转载自:WIN10 LTSC 使用照片查看器打开图片教程


新装的WIN10 LTSC 2019,发现默认看图则是画图,并不是照片查看器。

对WIN10 不太了解,不知道现在WIN10正确的看图方式还是不是照片查看器,但不管怎么样,照片查看器用的习惯了,所以想用回照片查看器,以下是操作教程:

新建一个文本文件,并复制以下代码粘贴保存,修改后缀为.bat

@echo off&cd\&color 0a&cls

echo 恢复Win10照片查看器

reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".jpg" /t REG_SZ /d PhotoViewer.FileAssoc.Tiff /f

reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".jpeg" /t REG_SZ /d PhotoViewer.FileAssoc.Tiff /f

reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".bmp" /t REG_SZ /d PhotoViewer.FileAssoc.Tiff /f

reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".png" /t REG_SZ /d PhotoViewer.FileAssoc.Tiff /f

echo 请双击或右击图片,选择“照片查看器”即可

pause

如果不会创建操作的,可以直接点击下载,然后一定要点击鼠标右键,以管理员身份运行,运行完毕后,随便找一张照片,右键,打开方式,选择照片查看器即可。

点击下载

【转】Java Thread的关于Join,wait,sleep的解释

转载自:Java Thread的关于Join,wait,sleep的解释


Java线程中的Thread.wait()方法
说句实话,在Thread中,我wait方法我从来没有用过,当线程需要休息时,我只是用到了sleep。今天花了点时间研究了一些wait和join方法。

首先,学习要从追问开始。
wait()这个方法它的功能是什么?它的功能是使当前线程阻塞以等待另外一个线程的方法。只有等待的线程里,调用了notify的方法,当前线程便会继续进行。

关于wait()方法,我认为以下这一点概念最为重要:
一:下面这段代码,并且不是使thread1线程阻塞,而是阻塞当前线程,去等待thread1线程调用nofity方法,要注意一开始我一直理解成thread1线程阻塞。

synchronized(thread1){
    thread1.wait();
}

其实只要理解了上面的概念,几乎已经理解wait方法的精髓,还剩一些小概念。
一、wait(long timeout); 这个方法的意思便是,阻塞当前线程timeout毫秒,如果在timeou毫秒之后被等待的线程没有调用notify方法,则结束阻塞。

二、当前每一个线程执行完之后,在C++层,会自动调用了notify。也就是说,假如我们等待的线程执行完毕了,当前等待的线程会自动结束阻塞。

三、wait需要在锁之内被调用。这一块我觉得这片文章写到点上了:https://blog.csdn.net/qq_39907763/article/details/79301813,经过测试,锁只能锁当前的线程的对象,锁其他对象会报监视器异常。

关于notify()方法
notify方法的意思就是,就是通知在等待的线程,你们可以执行的。假如有多个线程调用wait()而阻塞,则他们会相互竞争出一个。

关于notifyAll()方法
notifiyAll就是通知所有调用wait()而阻塞的线程,都继续进行

关于join方法
关于join方法,其实本质上就是判断了一些条件之后调用了wait(0),只要把wait方法理解透了,join自然就理解了。

Kotlin —— 这次入门就不用放弃了

节选自:Kotlin —— 这次入门就不用放弃了


写在文前

本文将展示在Android中会遇到的实际问题,并且使用Kotlin怎么去解决它们。一些Android开发者在处理异步、数据库或者处理Activity中非常冗长的listener时发现了很多的问题。通过一个个真实的场景,我们一边解决问题一边学习Kotlin的特性。

快速上手

如果不知道如何在Kotlin中写一个相当简单的Java表达式。这里有一个简单的诀窍,就是在AndroidStudio的Java文件中编写一段代码,然后将其粘贴到kt文件中,它会自动转换为Kotlin。

Kotlin优势

  1. 它更加易表现:这是它最重要的优点之一。你可以编写少得多的代码。
  2. 它更加安全:Kotlin是空安全的,也就是说在我们编译时期就处理了各种null的情况,避免了执行时异常。你可以节约很多调试空指针异常的时间,解决掉null引发的bug。
  3. 它可以扩展函数:这意味着,就算我们没有权限去访问这个类中的代码,我们也可以扩展这个类的更多的特性。
  4. 它是函数式的:Kotlin是基于面向对象的语言。但是就如其他很多现代的语言那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。其中一个很棒的特性就是Collections的处理方式。我稍后会进行介绍。
  5. 它是高度互操作性的:你可以继续使用所有用Java写的代码和库,甚至可以在一个项目中使用Kotlin和Java两种语言混合编程。一行Java一行Kotlin,别提有多风骚了。

开始使用Kotlin协程

节选自:开始使用Kotlin协程


本文主要介绍协程的用法, 以及使用协程能带来什么好处. 另外, 也会粗略提一下协程的大致原理.
本文的意义可能仅仅是让你了解一下协程, 并愿意开始使用它.
如果想彻底理解协程, 请查看官方文档, 官方文档链接将在文章的结尾给出.

如果你以前在别的语言里学习过协程, 如Python的yield, 那请你先忘记它们, 毕竟还是有些区别, 等你弄懂了Kotlin的协程, 再去作对比, 否则, 可能会有一些先入为主的思路来阻碍你理解, 我就吃过这个亏.

初识协程:

首先我们来瞄一眼协程是长啥样的, 以下引用(copy)了官网的一个例子:

fun main(args: Array<String>) {
    launch(CommonPool) {
        delay(1000L) 
        println("World!") 
    }
    println("Hello,")
    Thread.sleep(2000L)
}

/* 
运行结果: ("Hello,"会立即被打印, 1000毫秒之后, "World!"会被打印)
Hello, 
World!
*/

姑且不管里面具体的细节, 上面代码大体的运行流程是这样的:

A. 主流程:

1.调用系统的launch方法启动了一个协程, 跟随的大括号可以看做是协程体.
(其中的CommonPool暂且理解成线程池, 指定了协程在哪里运行)
2.打印出”Hello,”
3.主线程sleep两秒
(这里的sleep只是保持进程存活, 目的是为了等待协程执行完)

B. 协程流程:

1.协程延时1秒
2.打印出”World!”

解释一下delay方法:
在协程里delay方法作用等同于线程里的sleep, 都是休息一段时间, 但不同的是delay不会阻塞当前线程, 而像是设置了一个闹钟, 在闹钟未响之前, 运行该协程的线程可以被安排做了别的事情, 当闹钟响起时, 协程就会恢复运行.