Пул потоков Java реализует функцию всплеска

1. Введение в пул потоков

Пул потоков (английский: пул потоков): это форма многопоточной обработки, при которой задачи добавляются в очередь во время обработки, а затем эти задачи автоматически запускаются после создания потоков. Потоки пула потоков - это фоновые потоки. Каждый поток использует размер стека по умолчанию, работает с приоритетом по умолчанию и находится в многопоточном модуле. Если поток простаивает в управляемом коде (например, ожидает события), пул потоков вставит другой вспомогательный поток, чтобы все процессоры были заняты. Если все потоки пула потоков всегда заняты, но очередь содержит ожидающую работу, пул потоков через некоторое время создаст еще один вспомогательный поток, но количество потоков никогда не превысит максимальное. Потоки, которые превышают максимум, могут быть поставлены в очередь, но они не начнутся, пока не закончат другие потоки.

Ниже приведены учебные материалы, которые я собрал в Интернете по многопоточности Java и пулу потоков.

Учебные материалы 1: «Многопоточность Java»

Учебные материалы 2: «Пул потоков Java ExecutorService»

Учебные материалы 3: «Класс пула потоков Java ThreadPoolExecutor, ScheduledThreadPoolExecutor и класс фабрики Executors»

Учебные материалы 4: «Пул потоков Java реализует функцию всплеска»

 

2. Пул потоков Java реализует функцию всплеска.

[Пример] Java использует многопоточность и Redis для достижения случая, когда 1000 человек убивают 100 мобильных телефонов за секунды.

(1) Реализация SecondKill (SecondKill.java): создайте несколько потоков и используйте функцию транзакции Redis для реализации второй функции уничтожения.

package com.pjb.seckill;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.util.List;

/**
 * 秒杀抢购
 * @author pan_junbiao
 **/
public class SecondKill implements Runnable
{

    String iphone = "iphone";
    Jedis jedis = new Jedis("127.0.0.1",6379);
    String userInfo;

    public SecondKill(String userInfo)
    {
        this.userInfo = userInfo;
    }

    @Override
    public void run()
    {
        try
        {
            jedis.watch(iphone); //watchkeys

            String val = jedis.get(iphone);
            int valint = Integer.valueOf(val);

            if(valint<=100 && valint>=1)
            {
                //1、使用MULTI命令开启事务
                Transaction tx = jedis.multi();

                //2、事务命令入队
                tx.incrBy("iphone",-1);

                //3、使用EXEC命令执行事务
                //提交事务。如果此时watchkeys被改动了,则返回null
                List<Object> list = tx.exec();

                if(list==null || list.size()==0)
                {
                    String failuserinfo = "fail_" + userInfo;
                    String failinfo = "用户:" + failuserinfo + "商品争抢失败,抢购失败";
                    System.out.println(failinfo);
                    //抢购失败业务逻辑
                    jedis.setnx(failuserinfo,failinfo);
                }
                else
                {
                    for(Object succ : list)
                    {
                        String succuserinfo = "succ_" + succ.toString() + "_" + userInfo;
                        String succinfo = "用户:" + succuserinfo + " 抢购成功,当前抢购成功人数:" + (1 -(valint -100));
                        System.out.println(succinfo);
                        //抢购成功业务逻辑
                        jedis.setnx(succuserinfo,succinfo);
                    }
                }
            }
            else
            {
                String failuserinfo = "kcfail_" + userInfo;
                String failinfo1 = "用户:" + failuserinfo + " 商品被抢购完毕,抢购失败";
                System.out.println(failinfo1);
                jedis.setnx(failuserinfo,failinfo1);
                //Thread.sleep(500);
                return;
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            jedis.close();
        }
    }
}

(2) Основная программа (SecondKillTest.java): программа входа функции всплеска, используемая для создания пула потоков, одновременной генерации идентификатора пользователя, вызова кода функции всплеска и завершения задачи всплеска.

package com.pjb.seckill;

import com.pjb.util.RedisHelper;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;

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

/**
 * Redis秒杀功能的实现,1000人抢购100部手机
 * @author pan_junbiao
 **/
public class SecondKillTest
{
    public static void main(String[] args)
    {
         RedisHelper redisHelper = new RedisHelper();

        final String iphone = "iphone";
        //20个线程池并发数
        ExecutorService executor = Executors.newFixedThreadPool(20);

        final Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.del(iphone); //先删除
        jedis.set(iphone,"100"); //设置起始的抢购数
        jedis.close();

        for(int i=0; i<1000; i++)
        {
            String userInfo = "pan_junbiao的博客" + i;
            executor.execute(new SecondKill(userInfo));
        }
        executor.shutdown();
    }
}

Результаты:

 

3. Пул потоков Java реализует функцию задания времени.

[Пример] Java использует java.util.concurrent.ScheduledExecutorService для реализации задач синхронизации.

package com.pjb.seckill;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 使用ScheduledExecutorService实现定时任务
 * @author pan_junbiao
 */
public class Task
{
    public static void main(String[] args)
    {
        //1、创建线程任务
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                System.out.println("您好,欢迎访问 pan_junbiao的博客");
            }
        };

        //2、创建线程池
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

        //3、线程池绑定线程任务并执行(第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间)
        service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS);
    }
}

Результаты:

 

рекомендация

отblog.csdn.net/pan_junbiao/article/details/110236480