程序员人生 网站导航

java常见基础知识汇总(二)

栏目:框架设计时间:2017-01-12 11:59:41

甚么致使线程阻塞

线程的阻塞

为了解决对同享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对同享资源的访问,明显同步机制已不够了,由于在任意时刻所要求的资源不1定已准备好了被访问,反过来,同1时刻准备好了的资源也可能不止1个。为了解决这类情况下的访问控制问题,Java 引入了对阻塞机制的支持.

阻塞指的是暂停1个线程的履行以等待某个条件产生(如某资源就绪),学过操作系统的同学对它1定已很熟习了。Java 提供了大量方法来支持阻塞,下面让我们逐1分析。

  • sleep() 方法:sleep() 允许 指定以毫秒为单位的1段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间1过,线程重新进入可履行状态。 典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞1段时间后重新测试,直到条件满足为止。
  • suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可履行状态。典型地,suspend() 和 resume() 被用在等待另外一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另外一个线程产生了结果后,调用 resume() 使其恢复。
  • yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可履行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已履行了足够的时间从而转到另外一个线程.
  • wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种情势,1种允许 指定以毫秒为单位的1段时间作为参数,另外一种没有参数,前者当对应的 notify() 被调用或超越指定时间时线程重新进入可履行状态,后者则必须对应的 notify() 被调用.

初看起来它们与 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 其实不在语言级别上支持死锁的避免,我们在编程中必须谨慎地避免死锁。

抽象类与接口区分

  • 默许的方法实现 抽象类可以有默许的方法实现完全是抽象的。接口根本不存在方法的实现
  • 实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。
  • 构造器 抽象类可以有构造器 接口不能有构造器
  • 与正常Java类的区分 除你不能实例化抽象类以外,它和普通Java类没有任何区 接口是完全不同的类型
  • 访问修饰符 抽象方法可以有public、protected和default这些修饰符 接口方法默许修饰符是public。你可使用其它修饰符。
    -main方法
    抽象方法可以有main方法并且我们可以运行它
    接口没有main方法,因此我们不能运行它。
    - 多继承
    抽象类在java语言中所表示的是1种继承关系,1个子类只能存在1个父类,但是可以存在多个接口。
    - 速度
    它比接口速度要快
    接口是略微有点慢的,由于它需要时间去寻觅在类中实现的方法。
  • 添加新方法
    如果你往抽象类中添加新的方法,你可以给它提供默许的实现。因此你不需要改变你现在的代码。
    如果你往接口中添加方法,那末你必须改变实现该接口的类。

容器类之间的区分

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

hashmap和hashtable的区分

http://www.233.com/ncre2/JAVA/jichu/20100717/084230917.html

ArrayMap对照HashMap

http://lvable.com/?p=217

下面是最近在开发Android相干项目时的1些心得体会,懒得开新贴就1起汇总在这里吧,毕竟都是用Java开发的。

如何导入外部数据库

把原数据库包括在项目源码的 res/raw。
android系统下数据库应当寄存在 /data/data/com..(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下.操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录.

本地广播和全局广播

因广播数据在本利用范围内传播,不用担心隐私数据泄漏的问题。 不用担心别的利用捏造广播,造成安全隐患。 相比在系统内发送全局广播,它更高效。

intentService作用是甚么,AIDL解决了甚么问题

生成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/Window/View3者的差别,fragment的特点

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的生命周期影响。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐