aimn的开源库

自上周怒辞职以后,就开始苦逼的各种面试生涯,生活完全靠私活来接济,时有时没有,真难,还能快乐的玩耍吗,最多一天面试了5家,哎感觉都是不急招人,各种等待通知,好不容易等来一家,还克扣了薪资,从我要的12k到他们给8k,感觉累觉不爱。

面试都是基本过了二面的,大到腾讯,阿里,百度,网易,小到15人的创业公司我都去了,难得今天休息一下,总结下面试经验,以便下次面试用到。技术题目我就不说了,这是基础,不会的还是把基础看下吧。后面的题目都是让人蛋疼的机制问题。

1、什么是线程,线程和进程的区别,线程的工作原理

线程就是程序执行流中最小单元,是系统独立调度的基本单位,线程不具有任何系统资源,这里需要特别注意,

就象程序一样,线程有生命周期:它们启动、执行,然后完成。一个程序或进程也许包含多个线程,而这些线程看来互相单独地执行。

线程是通过实例化Thread对象或实例化继承Thread的对象来创建的,但在对新的Thread对象调用start()方法之前,这个线程并没有开始执行。当线程运行到其run()方法的末尾或抛出未经处理的异常时,它们就结束了。

sleep()方法可以用于等待一段特定时间;而join()方法可能用于等到另一个线程完成。

线程的一些基本方法:

isAlive():判断线程是否还"活"着 getPriority():获得线程的优先级数值 setPriority():设置线程的优先级数值 Thread.sleep():将当前线程睡眠指定毫秒数 join():调用某线程的该方法,将当前线程与该线程"合并",即等待该线程结束,再恢复当前线程的运行 yield():让出cpu,当前线程进入就绪队列等待调度 wait():当前线程进入对象的wait pool notify()/notifyAll():唤醒对象的wait pool中的一个/所有等待线程

特别注意sleep和wait的区别:

Wait是Object类的方法,范围是使该Object实例所处的线程。

Sleep()是Thread类专属的静态方法,针对一个特定的线程。

Wait方法使实体所处线程暂停执行,从而使对象进入等待状态,直到被notify方法通知或者wait的等待的时间到。Sleep方法使持有的线程暂停运行,从而使线程进入休眠状态,直到用interrupt方法来打断他的休眠或者sleep的休眠的时间到。

线程和进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是.

多线程

许多线程在执行中必须考虑与其他线程之间共享数据或协调执行状态。这就需要同步机制。在Java中每个对象都有一把锁与之对应。synchronized语句计算一个对象引用,试图对该对象完成锁操作, 并且在完成锁操作前停止处理。当锁操作完成synchronized语句体得到执行。当语句体执行完毕(无论正常或异常),解锁操作自动完成。作为面向对象的语言,synchronized经常与方法连用。一种比较好的办法是,如果某个变量由一个线程赋值并由别的线程引用或赋值,那么所有对该变量的访问都必须在某个synchromized语句或synchronized方法内。

1、MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。主线程创建时,会创建一个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue。其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。

2、Message:消息对象,Message Queue中的存放的对象。一个Message Queue中包含多个Message。Message实例对象的取得,通常使用Message类里的静态方法obtain(),该方法有多个重载版本可供选择;它的创建并不一定是直接创建一个新的实例,而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。如果Message Pool中没有可用的Message实例,则才用给定的参数创建一个Message对象。调用removeMessages()时,将Message从Message Queue中删除,同时放入到Message Pool中。除了上面这种方式,也可以通过Handler对象的obtainMessage()获取一个Message实例。

3、Looper:

是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能接受Message。如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。处理完成后,,调用Message.recycle()将其放入Message Pool中。

4、Handler:

无论身处何处,只要有一颗放松而美好的心态,生活便是美好!

aimn的开源库

相关文章:

你感兴趣的文章:

标签云: