newSingleThreadExecutor: 単一のスレッド数を持つスレッド プール (コア スレッドの数 = 最大スレッド数 = 1)
newFixedThreadPool: 修正済みスレッド数プール (コア スレッド数 = 最大スレッド数 = カスタム)
newCacheThreadPool: キャッシュ可能なスレッド プール (コア スレッド数 = 0、最大スレッド数 = Integer.MAX_VALUE) )
newScheduledThreadPool: スケジュールされたタスクまたは定期的なタスクをサポートするスレッド プール (コア スレッドの数 = カスタム、最大スレッド数 = Integer.MAX_VALUE)
上記の 4 つのスレッド プール クラスは、いずれも ThreadPoolExecutor を継承し、作成時に新しい ThreadPoolExecutor (パラメータ) を直接返します。これらの違いは、定義された ThreadPoolExecutor (パラメータ) 内のパラメータが異なることと、ThreadPoolExecutor が ExecutorService インターフェイスを継承することです。クラス。
定義:xecutorService executorService=Executors.newFixedThreadPool(2);
##デメリット: LinkBlockQueue のリンクリストブロッキングキューを使用しているため、タスクの蓄積速度が処理速度を上回るとタスクが蓄積しやすくなり、OOM メモリオーバーフローが発生しやすくなります。
newSingleThreadExecutor上記のコードは newFixedThreadPoop(1) に似ていますが、FinalizableDelegatedExecutorService の追加層があるため、違いがあります。その機能は次のとおりです。 fixedExecutorService の本質は ThreadPoolExecutor であるため、fixedExecutorService は ThreadPoolExecutor に強制的に転送できますが、singleExecutorService は ThreadPoolExecutor とは何の関係もないため、強制転送は失敗します。したがって、newSingleThreadExecutor() が作成された後は、スレッド プールのパラメータを変更できません。 、そしてそれはまさに単一のスレッドです。
デメリット: LinkBlockQueueのリンクリストブロッキングキューを使用しているため、タスクの蓄積速度が処理速度を上回るとタスクが蓄積しやすくOOMメモリオーバーフローが発生しやすくなります
newCacheThreadPool
定義: ExecutorService executorService=Executors.newCacheThreadPool();
欠点: SynchronousQueue は BlockingQueue の実装であり、キューでもあります。スレッドの最大数は Integer.MAX_VALUE であるため、スレッドが多すぎると OOM メモリ オーバーフローが発生しやすくなります。
ScheduledThreadPool定義: ExecutorService executorService=Executors.newScheduledThreadPool (2);
源码: public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { //ScheduledThreadPoolExecutor继承ThreadPoolExecutor return new ScheduledThreadPoolExecutor(corePoolSize); } public ScheduledThreadPoolExecutor(int corePoolSize) { //ScheduledThreadPoolExecutor继承ThreadPoolExecutor,故super()会调用ThreadPoolExecutor的构造函数初始化并返回一个ThreadPoolExecutor,而ThreadPoolExecutor使实现ExecutorService接口的 //最终ScheduledThreadPoolExecutor也和上面几种线程池一样返回的是ExecutorService接口的实现类ThreadPoolExecutor super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }
#keepAliveTime は現在のスレッド数を指します。 [コア スレッド数、スレッドの最大数] にあります。これらの非コア スレッドは、スレッド プールを終了する前に、何もせずにアイドル時間をどれだけ待機しますか。
ウェイティングリストと最大スレッド数は関係ありません スレッド作成優先度=コアスレッド>ブロッキングキュー>スレッド拡張(現在のコアスレッド数が最大スレッド数未満の場合のみスレッド拡張可能)
可以使用有界队列,自定义线程创建工厂ThreadFactory和拒绝策略handler来自定义线程池
public class ThreadTest { public static void main(String[] args) throws InterruptedException, IOException { int corePoolSize = 2; int maximumPoolSize = 4; long keepAliveTime = 10; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2); ThreadFactory threadFactory = new NameTreadFactory(); RejectedExecutionHandler handler = new MyIgnorePolicy(); ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); executor.prestartAllCoreThreads(); // 预启动所有核心线程 for (int i = 1; i <= 10; i++) { MyTask task = new MyTask(String.valueOf(i)); executor.execute(task); } System.in.read(); //阻塞主线程 } static class NameTreadFactory implements ThreadFactory { private final AtomicInteger mThreadNum = new AtomicInteger(1); @Override public Thread newThread(Runnable r) { Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement()); System.out.println(t.getName() + " has been created"); return t; } } public static class MyIgnorePolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { doLog(r, e); } private void doLog(Runnable r, ThreadPoolExecutor e) { // 可做日志记录等 System.err.println( r.toString() + " rejected"); // System.out.println("completedTaskCount: " + e.getCompletedTaskCount()); } } static class MyTask implements Runnable { private String name; public MyTask(String name) { this.name = name; } @Override public void run() { try { System.out.println(this.toString() + " is running!"); Thread.sleep(3000); //让任务执行慢点 } catch (InterruptedException e) { e.printStackTrace(); } } public String getName() { return name; } @Override public String toString() { return "MyTask [name=" + name + "]"; } } }
运行结果:
其中7-10号线程被拒绝策略拒绝了,1、2号线程执行完后,3、6号线程进入核心线程池执行,此时4、5号线程在任务队列等待执行,3、6线程执行完再通知4、5线程执行
以上がJava に付属する 4 つのスレッド プールとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。