欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

core java interview point (4)

程序员文章站 2022-07-12 19:51:24
...

26. ThreadPool用法与优势。

ThreadPool是java.util.concurrent包下,提供一系列与线程相关的类。

1.降低资源消耗:通过重复利用已经创建的线程就爱你各地线程创建和销毁造成的消耗

2.提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行

3.提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控

线程池可以应对突然大并发访问量,通过有限个固定线程为大量的操作提供服务,减少创建和销毁线程所消耗的系统资源。

 

27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

CountDownLatch是一个同步工具类,它允许一个或者多个线程一直等待,知道其它线程的操作执行完毕后在执行。

1.CountDownLatch是什么:

CountDownLatch是java1.5中引入的,与他一起被引入的并发工具包还有CyclicBarrier,Semaphore,ConcurrentHashMap和BlockingQueue,他们都存在于java.util.concurrent包下,CountDownLatch类能够使一个线程等待完成各自的工作后在执行。例如:程序的主线程希望在负责启动框架服务的线程启动完成后执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程完成自己任务后,计数器的值就-1。当计数器的值为0时,他表示所有的线程已经完成了任务,然后在闭锁上等待的先策划那个就可以回复执行任务。

step1.主线程启动,创建CountDownLatch的初始值N

step2.创建并启动N个线程

step3.主线程等待N个完成,每完成一个N-1,主线程任务其它线程全部完成,启动执行。

CountDownLatch类中定义的构造函数:

public CountDownLatch(int count){...}

构造器中计数值count就是闭锁需要等待的线程数量。主线程必须在启动其它线程后立即调用CountDownLatch.await(),该主线程就会在该方法上阻塞,知道其它线程完成各自任务。

其他N个对象必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经万册和凝固了自己的任务。这种通知机制是通过CountDownLatch.countDown()方法完成;每条用依次这个方法,在构造器函数中初始化的count值就会-1,直到count为0,至县城就能通过await()恢复执行自己的任务。

 

场景:

1.实现最大的并行性。

2.开始执行前等待N个线程完成各自任务

3.思索检测。

 

ArrayBlockingQueue阻塞队列,见生产者消费者模式中的队列存储,它能够自动等待阻塞。

 

 

28. wait()和sleep()的区别。

1.wait()是Object方法,所有的java类都直接或者间接继承了该方法。sleep()是Thread类中的静态方法。

2.wait()被调用时候,线程会释放对象锁,进入等待该对象的等待锁定池,只有针对该对象的唤醒方法notify()被调用后,本线程才进入对象锁定池准备重新获取对象锁,重新运行。

而sleep()不同,它是直接调用Thread.sleep(10),是让当前程序被打断暂停执行指定的时间,让出CPU该其他线程使用,但是监控状态仍然保持监听,当指定的时间到了又会自动恢复运行状态,对象锁不会被释放。

 

 

29. foreach与正常for循环效率对比。

循环数字数组时,for需要首先count数组长度,引入自增长变量,循环条件判断和自增长,输出数组时候还需要用哈希值

foreach循环数组,指针会自动指向下一个元素,不需要计算数组长度,没有条件判断和自增长变量,元素也不需要用哈希值,性能比for和while好。

 

数组循环用foreach,知道循环次数用for,条件循环用while,遍历数组用foreach。