线程的阻塞
为了解决对同享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对同享资源的访问,明显同步机制已不够了,由于在任意时刻所要求的资源不1定已准备好了被访问,反过来,同1时刻准备好了的资源也可能不止1个。为了解决这类情况下的访问控制问题,Java 引入了对阻塞机制的支持.
阻塞指的是暂停1个线程的履行以等待某个条件产生(如某资源就绪),学过操作系统的同学对它1定已很熟习了。Java 提供了大量方法来支持阻塞,下面让我们逐1分析。
初看起来它们与 suspend() 和 resume() 方法对没有甚么分别,但是事实上它们是截然不同的。区分的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这1对方法则相反。上述的核心区分致使了1系列的细节上的区分。
首先,前面叙述的所有方法都隶属于 Thread 类,但是这1对却直接隶属于 Object 类,也就是说,所有对象都具有这1对方法。初看起来这10分不可思议,但是实际上却是很自然的,由于这1对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法致使线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则致使因调用该对象的 wait() 方法而阻塞的线程中随机选择的1个消除阻塞(但要等到取得锁后才真正可履行)。
其次,前面叙述的所有方法都可在任何位置调用,但是这1对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。一样的道理,调用这1对方法的对象上的锁必须为当前线程所具有,这样才有锁可以释放。因此,这1对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这1对方法的对象。若不满足这1条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException 异常。
wait() 和 notify() 方法的上述特性决定了它们常常和synchronized 方法或块1起使用,将它们和操作系统的进程间通讯机制作1个比较就会发现它们的类似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的履行不会遭到多线程机制的干扰,而这1对方法则相当于 block 和wakeup 原语(这1对方法均声明为 synchronized)。它们的结合使得我们可以实现操作系统上1系列精巧的进程间通讯的算法(如信号量算法),并用于解决各种复杂的线程间通讯问题。
谈到阻塞,就不能不谈1谈死锁,略1分析就可以发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 其实不在语言级别上支持死锁的避免,我们在编程中必须谨慎地避免死锁。
http://www.cnblogs.com/yuanermen/archive/2009/08/05/1539917.html
http://alexyyek.github.io/2015/04/06/Collection/http://tianmaying.com/tutorial/java_collection
http://www.cnblogs.com/chenssy/p/3388487.html
http://www.233.com/ncre2/JAVA/jichu/20100717/084230917.html
http://lvable.com/?p=217
下面是最近在开发Android相干项目时的1些心得体会,懒得开新贴就1起汇总在这里吧,毕竟都是用Java开发的。
把原数据库包括在项目源码的 res/raw。
android系统下数据库应当寄存在 /data/data/com..(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下.操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录.
因广播数据在本利用范围内传播,不用担心隐私数据泄漏的问题。 不用担心别的利用捏造广播,造成安全隐患。 相比在系统内发送全局广播,它更高效。
生成1个默许的且与主线程相互独立的工作者线程来履行所有传送至onStartCommand() 方法的Intetnt。
生成1个工作队列来传送Intent对象给你的onHandleIntent()方法,同1时刻只传送1个Intent对象,这样1来,你就没必要担心多线程的问题。在所有的要求(Intent)都被履行完以后会自动停止服务,所以,你不需要自己去调用stopSelf()方法来停止。
该服务提供了1个onBind()方法的默许实现,它返回null
提供了1个onStartCommand()方法的默许实现,它将Intent先传送至工作队列,然后从工作队列中每次取出1个传送至onHandleIntent()方法,在该方法中对Intent对相应的处理。
AIDL (Android Interface Definition Language) 是1种IDL 语言,用于生成可以在Android装备上两个进程之间进行进程间通讯(interprocess communication, IPC)的代码。如果在1个进程中(例如Activity)要调用另外一个进程中(例如Service)对象的操作,就能够使用AIDL生成可序列化的参数。 AIDL IPC机制是面向接口的,像COM或Corba1样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
Activity像1个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸。
在Activity中调用attach,创建了1个Window。创建的window是其子类PhoneWindow,在attach中创建PhoneWindow。在Activity中调用setContentView(R.layout.xxx)。其中实际上是调用的getWindow().setContentView()。调用PhoneWindow中的setContentView方法。创建ParentView:
作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)。将指定的R.layout.xxx进行填充
通过布局填充器进行填充【其中的parent指的就是DecorView】。调用到ViewGroup。调用ViewGroup的removeAllView(),先将所有的view移除掉。添加新的view:addView()。
fragment 特点
Fragment可以作为Activity界面的1部份组成出现;可以在1个Activity中同时出现多个Fragment,并且1个Fragment也能够在多个Activity中使用;在Activity运行进程中,可以添加、移除或替换Fragment;Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响。