我要做 Android 之面笔试
二:如何进制转换
- 二进制 → 十进制
方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。
例:将二进制的(101011)B转换为十进制的步骤如下:
\1. 第0位 1 x 2^0 = 1;
\2. 第1位 1 x 2^1 = 2;
\3. 第2位 0 x 2^2 = 0;
\4. 第3位 1 x 2^3 = 8;
\5. 第4位 0 x 2^4 = 0;
\6. 第5位 1 x 2^5 = 32;
\7. 读数,把结果值相加,1+2+0+8+0+32=43,即(101011)B=(43)D。
- 八进制 → 十进制
方法:八进制数从低位到高位(即从右往左)计算,第0位的权值是8的0次方,第1位的权值是8的1次方,第2位的权值是8的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。
八进制就是逢8进1,八进制数采用 0~7这八数来表达一个数。
例:将八进制的(53)O转换为十进制的步骤如下:
\1. 第0位 3 x 8^0 = 3;
\2. 第1位 5 x 8^1 = 40;
\3. 读数,把结果值相加,3+40=
(二) (十进制) → (二、八、十六进制)
(Figure3:十进制转换为其它进制)
- 十进制 → 二进制
方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。
例:将十进制的(43)D转换为二进制的步骤如下:
\1. 将商43除以2,商21余数为1;
\2. 将商21除以2,商10余数为1;
\3. 将商10除以2,商5余数为0;
\4. 将商5除以2,商2余数为1;
\5. 将商2除以2,商1余数为0;
\6. 将商1除以2,商0余数为1;
\7. 读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,101011,即(43)D=(101011)B。
(Figure4:图解十进制 → 二进制)
- 十进制 → 八进制
方法1:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
例:将十进制的(796)D转换为八进制的步骤如下:
\1. 将商796除以8,商99余数为4;
\2. 将商99除以8,商12余数为3;
\3. 将商12除以8,商1余数为4;
\4. 将商1除以8,商0余数为1;
\5. 读数,因为最后一位是经过多次除以8才得到的,因此它是最高位,读数字从最后的余数向前读,1434,即(796)D=(1434)O。
43,即(53)O=(43)D。
算法实现:
public static void toBin(int num){ StringBuffer sb = new StringBuffer(); while(num>0){ sb.append(num%2); num = num / 2; } System.out.ptintln(sb.reverse()); }
三:如何正确结束 Java 线程
使用标志位
很简单地设置一个标志位,名称就叫做 isCancelled。启动线程后,定期检查这个标志位。如果 isCancelled = true,那么线程就马上结束。
public class MyThread implements Runnable { private volatile boolean isCancelled; public void run() { while(!isCancelled){ //do something } } public void cancel() { isCancelled=true; } }
注意的是,isCancelled 需要为 volatile,保证线程读取时 isCancelled 是最新数据。
我以前经常用这种简单方法,在大多时候也很有效,但并不完善。考虑下,如果线程执行的方法被阻塞,那么如何执行isCancelled的检查呢?线程有可能永远不会去检查标志位,也就卡住了。
使用中断
Java提供了中断机制,Thread类下有三个重要方法。
- public void interrupt()
- public boolean isInterrupted()
- public static boolean interrupted(); // 清除中断标志,并返回原状态
每个线程都有个boolean类型的中断状态。当使用Thread的interrupt()方法时,线程的中断状态会被设置为true。
下面的例子启动了一个线程,循环执行打印一些信息。使用isInterrupted()方法判断线程是否被中断,如果是就结束线程。
public class InterruptedExample { public static void main(String[] args) throws Exception { InterruptedExample interruptedExample = new InterruptedExample(); interruptedExample.start(); } public void start() { MyThread myThread = new MyThread(); myThread.start(); try { Thread.sleep(3000); myThread.cancel(); } catch (InterruptedException e) { e.printStackTrace(); } } private class MyThread extends Thread { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { try { System.out.println("test"); Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("interrupt"); //抛出InterruptedException后中断标志被清除,标准做法是再次调用interrupt恢复中断 Thread.currentThread().interrupt(); } } System.out.println("stop"); } public void cancel() { interrupt(); } } }
对线程调用interrupt()方法,不会真正中断正在运行的线程,只是发出一个请求,由线程在合适时候结束自己。
例如 Thread.sleep 这个阻塞方法,接收到中断请求,会抛出 InterruptedException,让上层代码处理。这个时候,你可以什么都不做,但等于吞掉了中断。因为抛出 InterruptedException 后,中断标记会被重新设置为false!看 sleep() 的注释,也强调了这点。
记得这个规则:什么时候都不应该吞掉中断!每个线程都应该有合适的方法响应中断!
所以在InterruptedExample例子里,在接收到中断请求时,标准做法是执行Thread.currentThread().interrupt()恢复中断,让线程退出。
从另一方面谈起,你不能吞掉中断,也不能中断你不熟悉的线程。如果线程没有响应中断的方法,你无论调用多少次interrupt()方法,也像泥牛入海。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
9月18日云栖精选夜读 | 从近1000篇Python文章中精选Top10
本次推荐的系列文章涉及: Python 小技巧、Socket 编程、Disguise(伪装)、Macro 宏、PostgreSQL、数据科学中的数学基础知识、谷歌面试问题讲解、员工流失预测问题以及 Discord 机器人。 热点热议 9月推荐 | 从近1000篇Python文章中精选Top10 作者:技术小能手 发表在:CDA数据分析师 十位改变世界的人工智能领域大师 作者:异步社区 独家 | 手把手带你用无监督学习检验国际美食! 作者:技术小能手 发表在:数据派THU 知识整理 通俗理解数字签名,数字证书和https 作者:技术小能手 发表在:安卓巴士Android开发者门户 第十五章:交互式界面(九) 作者:wangccsy 【实操】创建专有网络 作者:云特快 Python | 数据挖掘,WordCloud词云配置过程及词频分析 作者:技术小能手 发表在:Python专栏 算法面试题(四) 作者:技术小能手 发表在:IT技术之道 美文回顾 Android开发冷启动解决方案 实现秒开 作者:技术小能手 发表在:安卓巴士Android开发者门户 通过IP地址获取当前地理位置的接口(包含...
- 下一篇
厉害了,15 行代码让 iPhone 崩溃。。
一个名叫Sabri Haddouche的网络安全研究人员发推特说发现了苹果系统一个新的漏洞,可以使iPhone或Mac崩溃并重启。他们公布了一个只有15行代码的网页,访问这个页面就会让iPhone或iPad崩溃。 有人在开原网站github上发布了相关信息,包括bug的源代码,代码只有几行CSS和HTML代码。采用macOS和Windows 7测试了这个网页,苹果的浏览器Safari会死机崩溃,通过Firefox浏览器就不会有问题。 Haddouche介绍,iOS用的网页排版引擎WebKit有个弱点,而这个引擎是苹果要求,所有app所有浏览器必须用的。 只要在CSS的Backdrop-filter里嵌入大量元素,比如<div>标签,就可以耗尽设备的所有资源,造成内核错误(Kernel Panic) 。 “任何在iOS上呈现HTML的页面都会受到影响。”——这意味着如果有人通过社交媒体或电子邮件向你发送这个链接,或者你访问了包含代码的网页,你的设备就有可能崩溃。 根据外媒9to5Mac的说法,“大量计算导致WebKit渲染器过载,系统只能重启内核,也就出现了‘白苹果’,然后导...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群