线程池

java内置线程池:ThreadPoolExecutor

java内置线程池的封装线程池:
ExecutorService executor = Executors.newCachedThreadPool();
ExecutorService executor2 = Executors.newFixedThreadPool();
ExecutorService executo3 = Executors.newSingleThreadExecutor();

protected final ThreadPoolExecutor pool2 = new ThreadPoolExecutor(10,10,0,TimeUnit.DAYS,new LinkedBlockingQueue<>(),new DefaultThreadFactory("test1"),new ThreadPoolExecutor.AbortPolicy())


SynchronousQueue和LinkedBlockingQueue是Java中两种不同类型的阻塞队列,它们在实现上有一些区别。

  1. 容量限制:SynchronousQueue是一个没有容量限制的阻塞队列,每个插入操作必须等待一个相应的删除操作,否则插入操作将被阻塞。而LinkedBlockingQueue是一个具有可选容量限制的阻塞队列,可以根据需要设置容量大小。

  2. 公平性:SynchronousQueue是一个非公平的队列,它不保证等待时间最长的线程优先获取元素。而LinkedBlockingQueue可以选择是公平的还是非公平的,通过构造函数可以指定是否按照FIFO顺序来获取元素。

  3. 数据结构:SynchronousQueue内部并没有实际的存储空间,它仅仅作为一个传递元素的通道。而LinkedBlockingQueue是基于链表的数据结构,用于存储元素。

  4. 线程阻塞行为:SynchronousQueue的插入和删除操作都是阻塞的,插入操作必须等待某个线程来获取元素,删除操作必须等待某个线程来插入元素。而LinkedBlockingQueue的插入操作可以选择是阻塞的还是非阻塞的,删除操作总是阻塞的。

选择使用SynchronousQueue还是LinkedBlockingQueue取决于应用程序的需求。如果需要传递元素并且希望进行同步,可以选择使用SynchronousQueue。如果需要一个有容量限制的阻塞队列,可以选择使用LinkedBlockingQueue,并根据具体需求决定是否需要公平性和阻塞行为。

ExecutorService executor = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
ExecutorService executor2 = Executors.newFixedThreadPool(10);
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
ExecutorService executo3 = Executors.newSingleThreadExecutor();

public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}






posted @ 2024-01-19 16:44  人在代码在  阅读(9)  评论(0)    收藏  举报