深入学习java笔记-18.JUC-线程池

2019-05-14  本文已影响0人  笨鸡

学习目的:看MySQL索引优化时,教程需要70万测试数据,我得写一个random加线程池批量导入,节省时间。

new Thread弊端

线程池的好处

线程池-ThreadPoolExecutor

线程池内部属性

线程池.png

线程池相关方法

线程池-Executor框架接口

package juc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample1 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            int index = i;
            executorService.execute(()-> System.out.println("task:" + index));    //直接传i报错,提示需要一个final的数据,不太理解。
        }
        executorService.shutdown();
    }
}
package juc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample2 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            int index = i;
            executorService.execute(()-> System.out.println("task:" + index));
        }
        executorService.shutdown();
    }
}
package juc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample3 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            int index = i;
            executorService.execute(()-> System.out.println("task:" + index));
        }
        executorService.shutdown();
    }
}
package juc;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExample4 {
    public static void main(String[] args) {
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
//        for (int i = 0; i < 10; i++) {
//            int index = i;
//            executorService.execute(()-> System.out.println("task:" + index));
//        }
//        executorService.schedule(() -> System.out.println("schedule run"), 3, TimeUnit.SECONDS);
        executorService.scheduleAtFixedRate(() -> System.out.println("scheduleAtFixedRate run"),
                1, 3, TimeUnit.SECONDS);
//        executorService.shutdown();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("TimeTask Run");
            }
        }, new Date(), 2 * 1000);
    }
}
        StudentService studentService = ac.getBean(StudentService.class);
        int corePoolSize = 2;
        int maximumPoolSize = 16;
        long keepAliveTime = 30;
        TimeUnit unit = TimeUnit.SECONDS;
        LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(30);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize, maximumPoolSize, keepAliveTime,
                unit, workQueue, new ThreadPoolExecutor.CallerRunsPolicy());
        executor.prestartAllCoreThreads(); // 预启动所有核心线程
        for (int i = 0; i < 700000; i++) {
//            studentService.insertClass();
            executor.execute(()->studentService.insertClass());
        }
        // 线程池水深,我还得好好学习内部的参数配置与原理。

线程池-合理配置

上一篇 下一篇

猜你喜欢

热点阅读