我不是程序猿,请叫我攻城狮程序猿进化之路

Java开发程序员必须知道的并发零碎知识

2017-02-14  本文已影响5人  编程说书酱

线程和进程

进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。

但是要注意,一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资源和地址空间的。进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位。

实现线程

在程序开发中只要是多线程肯定永远以实现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初级课程,亲身感受这里的学习氛围。

动力节点
上一篇下一篇

猜你喜欢

热点阅读