优先级

JDK源码那些事儿之浅析Thread上篇

ⅰ亾dé卋堺 提交于 2020-01-23 03:53:39
JAVA中多线程的操作对于初学者而言是比较难理解的,其实联想到底层操作系统时我们可能会稍微明白些,对于程序而言最终都是硬件上运行二进制指令,然而,这些又太过底层,今天来看一下JAVA中的线程,浅析JDK源码中的Thread类,之后能帮助我们更好的处理线程问题 前言 JDK版本号:1.8.0_171 在Thread注释中可以看到大佬对其进行的解释: Thread就是程序中一个线程的执行.JVM允许一个应用中多个线程并发执行 每个线程都有优先级.高优先级线程优先于低优先级线程执行 每个线程都可以(不可以)被标记为守护线程 当线程中的run()方法代码里面又创建了一个新的线程对象时,新创建的线程优先级和父线程优先级一样 当且仅当父线程为守护线程时,新创建的线程才会是守护线程 当JVM启动时,通常会有唯一的一个非守护线程(这一线程用于调用指定类的main()方法) JVM会持续执行线程直到下面某一个情况发生为止: 1.类运行时exit()方法被调用且安全机制允许此exit()方法的调用. 2.所有非守护类型的线程均已经终止,或者run()方法调用返回或者在run()方法外部抛出了一些可传播性的异常. 可以联想下JVM的启动过程,从main方法启动,可以自己写代码查看下线程情况 线程实现 Thread注释类上清楚的写明了线程的两种实现方式: 定义一个继承Thread类的子类

adb logcat介绍

大憨熊 提交于 2020-01-23 02:37:08
logcat命令语法: [adb] logcat [<option>] ... [<filter-spec>] ... adb logcat -c 清除所有以前的日志 adb logcat -d 打印日志,且自动退出log模式 adb logcat -f 将日志输出到文件中。注意,这个文件保存在设备上,所以需要将日志创建在可写入的地方。比如/sdcard/logs.txt adb logcat -s 设置默认的过滤器, 如 我们想要输出 "System.out" 标签的信息, 就可以使用adb logcat -s System.out adb logcat -t N 查看最后的N条日志 adb logcat | grep XXX 管道命令,同Linux 也可以进入adb shell后,运行logcat。与adb logcat 参数一样。 1 日志过滤 每一个输出的Android日志信息都有一个标签和它的优先级。 日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就 是查看系统的标签). 优先级有下列集中,是按照从低到高顺利排列的: V — Verbose (lowest priority) D — Debug I — Info W — Warning E — Error F — Fatal S — Silent (highest priority, on which

关于后缀表达式和中缀表达式的思考

我们两清 提交于 2020-01-23 02:28:43
众所周知啦,我们数学里面的公式就是中缀表达式(infix),形如a*(b+c),支持括号用于调整运算的顺序。我们平常用的就是中缀表达式。 那么什么是后缀表达式(postfix)? 后缀表达式(又称为逆波兰reverse polish)就是不需要括号就可以实现调整运算顺序的一种技法。 比如:ab+cde+** 上面就是一个典型的后缀表达式,将它改为中缀表达式其实是(a+b)*((d+e)*c)。我们这样将后缀表达式转换成中缀表达式,虽然符合我们的数学计算习惯,但是并不符合计算机运算的方式。我们可以通过数据结构中的栈来理解后缀表达式和它为什么符合计算机计算。 什么是栈(stack)呢?简单的说就是LIFO(后入先出)。画一张图就是下面这样 堆栈的操作其实很简单,你可以把堆栈想象成一个汉诺塔,你可以在塔顶不断加上汉诺圈,可以从顶部一个一个拿走,但是你不能直接从下面拿走最先放的那个圈。所以你懂了吧,要想拿到最先那个,你必须取出所有的圈,而你最后摆上去的圈可以被立刻拿到。这就是LIFO的本质。 堆栈的实现方法可以是链表或者数组。它们各有各得优点,它们的对比网络上有很多啦,当然我以后也会写出来。 现在你知道了栈这种结构就可以重新理解一遍后缀表达式。我们就以 "ab+cde+**" 这个表达式举例。我们创建一个栈,然后从这个表达式开头(当然是从左边)扫描,如果扫描到的是数据就压(push)到栈中

Andriod设计简易计算器

佐手、 提交于 2020-01-22 23:06:35
1.设计任务及要求 (1)设计一款基于Android系统下的计算器,实现加减乘除算法,以及清零、撤销操作。界面设计应该就尽量简洁而美观,具有良好的交互性,程序应具有较好的稳健性; (2)另起一行显示运算结果; (3)在整个输入和计算过程中,首先应该对输入的数据进行容错处理,这样有利于提高用户体验。容错设计比如:在输入过程中操作符不能连续输入,整数数据的开头不能出现0等。在程序设计过程中,需要设计数据结构来存储数字、操作符和容错标记; (4)对于连续输入的多组数据,如3+8/2-9 8或(1+2) 3+5-4/2,应当能够区分各个数字和运算符,并且根据优先级进行运算。 2.设计原理及结构框图 将表达式的字符串进行处理,将数字和运算符分别存放在两个栈中,设计方法来处理两个栈从而得到相应的计算结果,将操作符设计优先级,乘除优先级设置为2,加减优先级设置为1。 (1)从操作符栈中弹出两个操作符,假设为symbol1和symbol2,比较两个操作付的优先级,如果symbol1的优先级大于等于symbol2的则执行二,否则执行三。 (2)从数字栈中弹出两个数字,计算这两个数字在操作符symbol1下的运算结果,结束后将结果压入数字栈,将symbol2压入操作符栈,最后返回一。 (3)从数字栈中弹出三个数字,计算后两个数字在操作符symbol2下的运算结果,结束后将运算结果压入栈

操作系统导论读书笔记—虚拟化CPU之调度

那年仲夏 提交于 2020-01-22 16:11:09
虚拟化CPU之调度 1. 底层机制 1.1 用户模式与内核模式 1.1.1 系统调用 1.1.2 用户态与内核态切换过程 1.2 进程间切换 1.2.1 协作方式:等待系统调用 1.2.2 非协作方式:操作系统控制 1.2.3 保存和恢复上下文 1.2.4 时间中断进程切换 2. 调度策略 2.1 进程调度的相关概念 2.1.1 调度的性能指标 2.1.2 IO消耗型和CPU消耗型进程 2.1.3 进程优先级 2.1.4 时间片 2.2 几种基本调度算法 2.2.1 先入先出FIFO 2.2.2 最短任务优先SJF 2.2.3 最短完成时间优先STCF 2.2.4 轮转调度RR 2.2.5 总结对比 2.3 经典调度算法 2.3.1 多级反馈队列MLFQ 2.3.2 比例份额调度 2.4 多处理器调度 2.4.1 多处理器的特性 2.4.2 单队列调度 2.4.3 多队列调度 2.4.4 linux多处理器调度 1. 底层机制 操作采用时分共享CPU的方式实现虚拟化CPU。在实现虚拟化的同时,我们要保证整体性能且不失去CPU的控制权。 1.1 用户模式与内核模式 为了防止某个任务抢夺所有资源或者影响其它任务的运行,我们需要限制进程的操作,保证操作系统的控制权。 在用户模式下,应用程序不能完全访问硬件资源。在内核模式下,操作系统可以访问机器的全部资源。并提供了内核态与用户态的切换方式

6.1 运算符优先级

拈花ヽ惹草 提交于 2020-01-22 10:04:14
一、优先级 考虑下面的代码: butter = 25.0 + 60.0 * n / SCALE; 这条语句中有加法、乘法和除法运算。先算哪一个?是25.0加上60.0,然后把计算的和85.0乘以n,再把结果除以SCALE?还是60.0乘以n,然后把计算的结果加上25.0,最后再把结果除以SCALE?还是其他运算顺序?假设n是6.0,SCALE是2.0,带入语句中计算会发现,第1种顺序得到的结果是255,第2种顺序得到的结果是192.5。C程序一定是采用了其他的运算顺序,因为程序运行该语句后,butter的值是205.0。 显然,执行各种操作的顺序很重要。C 语言对此有明确的规定,通过运算符优先级来解决操作顺序的问题。每个运算符都有自己的优先级。正如普通的算术运算那样,乘法和除法的优先级比加法和减法高,所以先执行乘法和除法。如果两个运算符的优先级相同怎么办?如果它们处理同一个运算对象,则根据它们在语句中出现的顺序来执行。对大多数运算符而言,这种情况都是按从左到右的顺序进行(=运算符除外)。因此,语句: butter = 25.0 + 60.0 * n / SCALE; 的运算顺序是: 60.0 * n     首先计算表达式中的*或/(假设n的值是6,所以60.0*n得360.0) 360.0 / SCALE   然后计算表达式中第2个*或/ 25.0 + 180     

Python之常用操作符+习题复习

别等时光非礼了梦想. 提交于 2020-01-22 05:45:00
##算术操作符 (加减乘除前面四个和以前的编程语言都一样,小技巧也一样a = a+3可以写成a +=3,等等又如a = a*3,可以写成a *= 3,python中10/8是等于1.25,返回的是一个精确的值,而不是1,要想得到1就用双//,如10//8=1,浮点类型,就得浮点类型,%就是取余数,11%2商5余1,所以结果是1,最后两个**就是幂运算,比如3**2 表示的是3的2次方就是9) ##优先级问题 (总的说就是先乘除后加减,但是单目运算符优先级会比较高,比如-当做负号使用时,当然,有括号就先计算括号的值。需要注意的是幂运算操作符比其左侧的一元操作符即单目运算符优先级高,比其右侧的一元操作符优先级低,如下例子,结果是-9,说明先执行了3的2次幂,在取负数。一元运算符在右侧就先计算一元运算符,变成-2,在执行3的-2次幂) ##比较操作符 (比较操作符就是根据表达式的真假来返回布尔类型的值) ##逻辑操作符 (and操作符两边都为真才为真,or操作符只要其中一个为真就为真了,not是一元操作符,只有一个操作数,就是把这个操作数取他相反的布尔类型的值,然后在python中3<4<5是可以的,返回值是True,他被解释为(3<4) and (4<5),但是在其他语言是行不通的) ##又是优先级问题 ##温故知新之习题 0. Python 的 floor 除法现在使用 “ // ”

unity行为树简介

做~自己de王妃 提交于 2020-01-22 03:35:29
目前在Unity3D游戏中一般复杂的AI都可以看到行为树的身影,简单的AI使用状态机来实现就可以了,所以这里我也是简单的学习下,为以后用到做准备。 行为树的概念出现已经很多年了,总的来说,就是使用各种经典的控制节点+行为节点进行组合,从而实现复杂的AI。 Behavior Designer插件里,主要有四种概念节点,都称之为Task。包括: (1) Composites 组合节点,包括经典的:Sequence,Selector,Parallel (2) Decorator 装饰节点,顾名思义,就是为仅有的一个子节点额外添加一些功能,比如让子task一直运行直到其返回某个运行状态值,或者将task的返回值取反等等 (3) Actions 行为节点,行为节点是真正做事的节点,其为叶节点。Behavior Designer插件中自带了不少Action节点,如果不够用,也可以编写自己的Action。一般来说都要编写自己的Action,除非用户是一个不懂脚本的美术或者策划,只想简单地控制一些物件的属性。 (4) Conditinals 条件节点 ,用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用

BZOJ 1009 [汉诺塔]

自闭症网瘾萝莉.ら 提交于 2020-01-22 00:51:48
题面 题意   对于 \(n\) 层的汉诺塔,将一个盘子从一个柱子挪到另一个柱子,这样的操作一共有六种:AB,AC,BC,BA,CA,CB,对这六种操作给出优先级,每一次从所有合法的操作中选择出上一次没有移动过的盘子中操作优先级最高的操作执行,求出需要的步数。 题解   假设空的塔底有无穷大的盘子。只考虑塔顶的盘子,每次只可能移动最小的和次小的两个盘子,而移动次小的盘子之后,次小的盘子依旧是下一时刻次小的盘子,所以最小和次小的盘子必定有一个在上一时刻被移动过,所以操作只可能是移动最小的盘子到优先级较高的堆上,以及移动次小的盘子到最大的盘子上这两个步骤的循环。   因为优先级只对最小的盘子有影响,而最小的盘子每次操作时的开始位置都确定,所以只有从同一盘子出发的操作优先级才有意义。而根据上面步骤是循环的结论,我们已经可以模拟出最小的盘子的移动轨迹。不妨令第一个塔出发到第二个塔的优先级比到第三个塔上高(如非如此,交换第二个塔和第三个塔),这样,最小的盘子的轨迹只有三种情况: \(1,2,3,1,2,3,\dots\) , \(1,2,1,2,\dots\) 和 \(1,2,3,2,3,\dots\) 。   以 \(n=4\) 为例,对于三种情况分别模拟所有盘子的移动轨迹,其中除第一列外,第 \(i\) 行第 \(j\) 列上有数字代表第 \(j\) 次操作时第 \(i\)

中缀表达式求值

守給你的承諾、 提交于 2020-01-21 09:06:08
所谓 表达式的求值 就是从键盘上输入一个四则运算表达式按下Enter后在屏幕上输出表达式的结果。表达式的求值 在计算机的应用中非常广泛, 例如编译器中对所写的程序表达式的编译等。它 也是数据结构课程中栈这一章节中非常重要的一个算法,通过实现这个算法可以更好的掌握 和理解 栈的相关操作 。 中缀表达式是指运算符在运算数的中间,计算中缀表达式时需要用到两个栈:数字栈和运算符栈。在整个中缀表达式求值的过程中主要涉及到的模块有:栈的相关操作、优先级表的确立、输入的待计算字符串拆分为数字和运算符以及运算处理等。 一) 、整体算法思路 1) 、设立操作数栈和运算符栈,设表达式结束的标志是字符#,运算符栈底初始化为#,约定#运算符的优先级最小(这样做的目的是在当两个#相遇时就可以确定表达式扫描结束了)。 2) 、若当前扫描到的是操作数则果断将此数压栈进操作数栈,如果当前是符号栈则将该操作符和栈顶操作符进行优先级比较如果低于栈顶优先级则将操作符栈顶元素弹出并弹出两个操作数进行运算,运算完毕将结果压入栈中。如果当前符号的优先级高于栈顶优先级则将此运算符入栈。 3) 、循环操作2直到输入的表达式运算结束(运算符栈底的#和输入的表达式的#相遇)此时如若操作数栈中只剩一个数字则表示运算成功,此数就是表达式的结果,如果不止一个数则表示输入的表达式有误。 二) 、优先级表