Java开发程序员必须知道的并发零碎知识
线程和进程
进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。
但是要注意,一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资源和地址空间的。进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位。
实现线程
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享《线程池》
java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行
Thread 类中的start 和 run 方法有什么区别?
这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start方法被用来启动新创建的线程,而且start内部调用了 run方法,这和直接调用run方法的效果不一样。当你调用run方法的时候,只会是在原来的线程中调用,没有新的线程启动,start 方法才会启动新线程。
Java中Runnable和Callable有什么不同?
相同点:
两者都是接口;(废话)
两者都可用来编写多线程程序;
两者都需要调用Thread.start启动线程;
不同点:
两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
Callable接口的call方法允许抛出异常;而Runnable接口的run方法的异常只能在内部消化,不能继续上抛;
Callable接口支持返回执行结果,此时需要调用FutureTask.get方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!
CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N(CountDownLatch(intcount))。
CountDownLatch的方法有:await,await(longtimeout,TimeUnitunit),countDown,getCount等。
CyclicBarrier
让一组线程达到一个屏障时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier默认的构造方法是CyclicBarrier(intparties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经达到了屏障,然后当前线程被阻塞。
CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset方法重置。
Semaphore
Java中的Semaphore是一种新的同步类,它是一个计数信号。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire,然后再获取该许可。每个 release添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。信号量常常用于多线程的代码中,比如数据库连接池。
关注“动力节点Java学院”微信公众号,获取更多相关资讯,现在报名Java培训,可免费参加Java初级课程,亲身感受这里的学习氛围。
动力节点