十二、java多线程基础之小案例一

一、背景

1.前面讲解了很多的基础理论知识,现在我们开始几个简单点的小栗子,来巩固下我们前面学习的基础知识,接下来我们来具体来讲解下例子吧。

2.参考这位博主的博客:https://blog.csdn.net/w_t_y_y/article/details/102817576,我会在他的基础之上再具体完善下我自己的东西。

二、实例一

1.ThreadPoolTaskExecutorConfig.java

package exceldemo.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
@Configuration
public class ThreadPoolTaskExecutorConfig {
    private static int CORE_POOL_SIZE = 5;
    private static int MAX_POOL_SIZE = 1000;
    @Bean(name="threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor serviceJobTaskExecutor(){
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量
        poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        //线程池维护线程的最大数量
        poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        //线程池所使用的缓冲队列
        poolTaskExecutor.setQueueCapacity(200);
        //线程池维护线程所允许的空闲时间
        poolTaskExecutor.setKeepAliveSeconds(30000);
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        System.out.println(poolTaskExecutor);
        return poolTaskExecutor;
    }
}

2.MyOrderRunnableTask.java

public class MyOrderRunnableTask implements Runnable{

    private String name;

    public MyOrderRunnableTask(String name){
        this.name = name;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        name = "MyOrderRunnableTask";
        System.out.println("MyOrderRunnableTask已执行");
    }
}

3.MyOrderCallableTask.java

public class MyOrderCallableTask implements Callable<String> {

    private String name;

    public MyOrderCallableTask(String name) {
        this.name = name;
    }

    @Override
    public String call() throws Exception {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        name = "MyOrderCallableTask";
        System.out.println("MyOrderCallableTask已执行");
        return name;
    }
}

4.MyOrderDemo.java

@RestController
@RequestMapping("/myOrderDemo")
public class MyOrderDemo {

    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @RequestMapping("/execute")
    public void execute(){
        String str = "execute方法";
        threadPoolTaskExecutor.execute(new MyOrderRunnableTask(str));
        System.out.println("主线程调用结束");

    }

    @RequestMapping("/submit")
    public String submit(){
        String str = "submit方法";
        Future<String> future = threadPoolTaskExecutor.submit(new MyOrderCallableTask(str));
        try {
            str = future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("主线程调用结束");
        return str;
    }

    @RequestMapping("/submit1")
    public String submit1(){
        String str = "";
        try {
        Future future = threadPoolTaskExecutor.submit(()->{
            return myOrderCallTaskMethod("submit1方法");
        });
            str = (String) future.get();
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("主线程调用结束");
        return str;
    }

    private String myOrderCallTaskMethod(String string) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return string;
    }
}

5.postman直接测试结果就行了,结果就省略了。

三、实例二

1.项目结构

2.ThreadPoolTaskExecutorConfig.java

@Configuration
public class ThreadPoolTaskExecutorConfig {
    private static int CORE_POOL_SIZE = 5;
    private static int MAX_POOL_SIZE = 1000;
    @Bean(name="threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor serviceJobTaskExecutor(){
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量
        poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        //线程池维护线程的最大数量
        poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        //线程池所使用的缓冲队列
        poolTaskExecutor.setQueueCapacity(200);
        //线程池维护线程所允许的空闲时间
        poolTaskExecutor.setKeepAliveSeconds(30000);
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        System.out.println(poolTaskExecutor);
        return poolTaskExecutor;
    }
}

3.User.java

public class User {
    int age;
    String userName;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

4.UserService.java

public interface UserService {
    List<User> getByIds(List<Integer> ids);
    void addUserAction();
}

5.UserServiceImpl.java

@Service("userService")
public class UserServiceImpl implements UserService {
    @Override
    public List<User> getByIds(List<Integer> ids) {
        List<User> users = new ArrayList<>();
        for (Integer id : ids) {
            User user = new User();
            user.setAge(id);
            user.setUserName("用户" + id);
            //耗时操作
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            users.add(user);
        }
        return users;
    }

    @Override
    public void addUserAction() {
        //耗时操作
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("行为记录");
    }
}

6.DemoTask.java

public class DemoTask implements Runnable {

    private List<Integer> ids ;

    public  DemoTask(List<Integer> ids){
        this.ids = ids;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //System.out.println("run "+ids.size());
    }
}

7.UserTask.java

public class UserTask implements Callable<List<User>> {

    private List<Integer> userIds;
    private UserService userService;

    public UserTask(List<Integer> queryIds, UserService userService) {
        this.userService = userService;
        this.userIds = queryIds;
        //System.out.println("ids  "+queryIds.size());
    }

    @Override
    public List<User> call() throws Exception {
        //System.out.println("*******************");
        List<User> users = userService.getByIds(userIds);
        return users;
    }
}

8.postman调用接口(结果)

8.1.返回结果

8.2.后端输出结果

行为记录
耗时1568

四、结束

Always keep the faith!!!

发布了122 篇原创文章 · 获赞 64 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/chenmingxu438521/article/details/103885474