美文网首页Java 杂谈
多线程任务的优化问题一

多线程任务的优化问题一

作者: mister_tao | 来源:发表于2016-09-20 11:27 被阅读0次

问题:当每次点击界面上的item触发开启一个子线程,去请求网络数据,界面上的item很多,在用户迅速点击的情况下, 会新建n个子线程, 每个线程在内存中占用1M空间, 消耗非常大,如何优化这种多线程任务?

解决方案: 用线程池去处理这种多线程的任务, 线程池的核心线程个数为1 ,用有界队列将新的线程添加进来,有界队列的size 也为1,即在线程池中 只能同时允许1个线程运行, 1个线程等待,在将新的线程添加进线程池之前, 先将线程池的队列清空,具体实现方案如下:

public class CountRunnable implements Runnable{

@Override

public void run() {

for(int i = 0 ; i < 5 ; i++){

System.out.println(Thread.currentThread().getName()+" i : "+i);

try {

Thread.sleep(50);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println("---------------------------------");

}

}

int corePoolSize = 1;//核心线程个数

int maximumPoolSize  = 1;//最大线程个数

long keepAliveTime = 5;//线程存活时间

TimeUnit unit = TimeUnit.SECONDS;

ArrayBlockingQueueworkQueue = new ArrayBlockingQueue<>(1);

ThreadPoolExecutor executor =new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue);

//添加十个任务

for(int i = 1 ; i < 10; i++){

BlockingQueuequeue = executor.getQueue();

queue.clear();//添加任务之前,先将任务队列清空

System.out.println("blockQueue size : "+executor.getQueue().size());

executor.execute(new CountRunnable());

}

System.out.println("## blockQueue size : "+executor.getQueue().size());

上面所做的操作实际就是:用线程池去处理这种多线程的任务, 线程池的核心线程个数为1 ,用有界队列将新的线程添加进来,有界队列的size 也为1,即在线程池中 只能同时允许1个线程运行, 1个线程等待,在将新的线程添加进线程池之前, 先将线程池的队列清空, 输出的log可以看到, 虽然在运行的过程中添加了10个线程任务, 但是实际上只运行完成了两个线程任务:

blockQueue size : 0

blockQueue size : 0

blockQueue size : 0

blockQueue size : 0

blockQueue size : 0

pool-1-thread-1 i : 0

blockQueue size : 0

blockQueue size : 0

blockQueue size : 0

blockQueue size : 0

## blockQueue size : 1

pool-1-thread-1 i : 1

pool-1-thread-1 i : 2

pool-1-thread-1 i : 3

pool-1-thread-1 i : 4

---------------------------------

pool-1-thread-1 i : 0

pool-1-thread-1 i : 1

pool-1-thread-1 i : 2

pool-1-thread-1 i : 3

pool-1-thread-1 i : 4

---------------------------------

通过这种方式, 不管用户如何点击界面上的item ,实际上页面所需要的数据是用户最后一次点击item所返回回来的数据, 这样就避免了创建n个不必要的线程任务.

相关文章

  • 多线程任务的优化问题一

    问题:当每次点击界面上的item触发开启一个子线程,去请求网络数据,界面上的item很多,在用户迅速点击的情况下,...

  • Java线程池的坑

    背景 最近在优化代码(把一个大任务变成使用多线程分批执行小任务),使用多线程首当其冲就是使用线程池,一般比较常用的...

  • Kotlin:该如何实现多线程同步?

    问题背景需执行多线程任务:任务1、任务2并行执行;等全部执行完成后,执行任务3。 实现方式「多线程同步」。Kotl...

  • 了解异步任务——走近Future模式

    一、定义1.1 什么是异步任务说到异步任务,我们第一时间想到的是多线程,我们常说的多线程问题,一般是指线程并发问题...

  • 线程池的监控与优化

    多线程池是我们最常用的并行编程工具,多线程是性能优化在多核处理器时代是最常用的手段。而线程池是处理并发请求和任务的...

  • Java 多线程(三)优化任务执行

    本篇文章通过服务器通信和页面渲染两个功能的实现来加深多线程中Future和Executor的理解。 服务器通信 串...

  • 锁性能优化

    优化思路:避免死锁、减少锁粒度、锁分离等一、线程开销1.处理线程任务外,还要维护多线程环境的特有信息,如:线程本身...

  • 面试知识点 总结

    1,runtime 2,runloop 3,优化卡顿问题(数据处理的异步线程)。 4,多线程 5,核心动画

  • jdk 1.7 HashMap死循环问题

    [toc]注:JDK1.8之后进行了优化,多线程不会造成死循环问题,但依旧线程不安全,容易造成数据丢失,多线程推荐...

  • 整理一下知识点

    iOS多线程的使用 iOS核心优化

网友评论

    本文标题:多线程任务的优化问题一

    本文链接:https://www.haomeiwen.com/subject/bofoettx.html