java 并发编程 ThreadLocal、线程池

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 06:23   26   0

ThreadLocal

顾名思义,本地线程,虽然使用的是同一个变量, 但是在不同的线程里面,每个线程之间的变量数据不同享,彻底隔离数据,

ThreadLocal底层原理

其实就是在每个线程的本地内存里面建一个map,把值放到这个map中,详细代码如下:

线程池

四种线程池

1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

示例如下

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(new Runnable() {
  public void run() {
  System.out.println(Thread.currentThread().getName() + "---" + index);
  }
});


2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
final ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(3);
newCachedThreadPool.execute(new Runnable() {
        public void run() {
   System.out.println("i:" + index);
  }
});


3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

// 创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);
newScheduledThreadPool.schedule(new Runnable() {
 public void run() {
  System.out.println("delay 3 seconds");
 }
}, 3, TimeUnit.SECONDS);


4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级);

ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
newSingleThreadExecutor.execute(new Runnable() {

 @Override
 public void run() {
   System.out.println("index:" + index);   
 }
});

线程池的另一种用法,并发执行, tasklist 中的所有代码执行完毕后才会继续后面的代码执行

 // // 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        //添加并行执行的代码
        List<Callable<Object>> taskList = new ArrayList<Callable<Object>>();
        taskList.add(new Callable<Object>() {
            public Object call(){
                System.out.println("我运行了");
                return "hello";
            }
        });
        taskList.add(new Callable<Object>() {
            public Object call(){
                System.out.println("我也运行了");
                return "would !";
            }
        });
        // 如果线程池执行时间超时会抛出CancellationException 异常,因此设置为不限制时长
        
        List<Future<Object>> futures = executorService.invokeAll(taskList);
//        List<Future<Object>> futures = executorService.invokeAll(taskList,3000,TimeUnit.MILLISECONDS);
        for(Future item : futures){
            // 循环取值,如果有异常抛出,不循环执行的话,异常会被线程吃掉,有错误也不知道了
            item.get();
        }
        //关闭并存线程池
        executorService.shutdown();

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP