通过餐厅理解-Java中的线程池
假设你开了一家餐厅,每当有顾客来吃饭,你就需要为他们提供一个服务员。如果每次有新的顾客来,你都去招聘一个新的服务员,这显然是非常低效和浪费资源的。因为招聘服务员需要时间,而且服务员在完成服务后,如果没有其他的工作,他就会闲着,这是对资源的浪费。而且,如果一下子来了很多顾客,你可能需要招聘很多服务员,这可能会导致你的餐厅人满为患,甚至可能会导致你的餐厅崩溃。
因此,一个更好的办法是,你提前招聘一定数量的服务员,并把他们放在一起,形成一个服务队列,这就是所谓的服务员池,也就是线程池的概念。当有新的顾客来时,你就从服务员池中取出一个服务员为他服务,服务结束后,服务员就回到服务员池中,等待下一次的服务。这样,你就可以更好地管理和控制服务员,避免资源的浪费,提高效率。
下面,我们通过代码来实现一个简单的线程池:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MyThreadPool { public static void main(String[] args) { // 创建一个固定大小的线程池 ExecutorService threadPool = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { final int index = i; threadPool.execute(new Runnable() { @Override public void run() { System.out.println("服务员" + index + "开始服务"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("服务员" + index + "服务结束"); } }); } // 关闭线程池 threadPool.shutdown(); } }
在这个例子中,我们创建了一个固定大小的线程池,大小为5。然后,我们创建了10个任务,每个任务就像一个顾客,需要一个服务员来服务。当任务被提交到线程池时,线程池会从中选择一个空闲的线程来执行任务。当线程执行完任务后,它会返回到线程池中,等待下一次的任务。