多线程并行请求问题及SplashActivity预加载问题解决方案
1. 问题描述(一):
现有3个线程thread1, thread2, thread3。这3个线程是并发执行的,当着3个线程都执行完成以后,需要执行一个finish()事件。
1.1 实现方法:
/** 定义一个静态标记 **/
private static byte nbTemp = 0; private void aa(){
// 线程1
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程2
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程3
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
}); thread1.start();
thread2.start();
thread3.start();
} /** 注意:要添加关键字“synchronized”,否则会先同时操作bb()方法 */
private synchronized void bb(){
nbTemp ++;
if(nbTemp == (byte)3) {
finish(); // 条件达成,执行finish();
}
}
1.2 其他实现方式:
2. 问题描述(二):
我们回到APP上,在APP启动时,我们会先启动Splash,会在Splash中做一些预加载。那么由于网速等等原因,导致预加载的时间不太固定。那么我们既不希望他加载的过快,会导致页面的存在感不强;也不希望加加载过慢,误以为“卡死”。那么我们就需要设置一个最小加载时间和最大加载时间。那么如何时间呢?
/** 定义一个静态标记 **/
private static byte nbTemp = 0;
/** 开始时候的时间戳 **/
private long nlStartTime;
/** 最大时间戳 **/
private long nlMaxTime;
/** finish()方法标记,防止多次执行 **/
private boolean isFirst;
/** 最小等待时间 **/
private short nsMinTime = 3000;
/** 最大等待时间 **/
private short nsMaxTime = 6000; private void aa(){
// 线程1
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程2
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
});
// 线程3
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
// ...
bb();
}
}); Thread threadTimeManager = new Thread(new Runnable() {
41 @Override
public void run() {
while(ture) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
nlStartTime += 1000;
if(nlCurrentTime < nlStartTime) {
nbTemp = 3;
50 bb();
51 return;
52 }
53 }
54 }
55 }); // 记录当前时间
nlStartTime = System.currentTimeMillis();
nlCurrentTime = nlStartTime - nsMaxTime + 1; // 最大间隔6s;
isFirst = true; thread1.start();
thread2.start();
thread3.start();
threadTimeManager.start();
} /** 主要要添加关键字“synchronized”,否则会先同时操作bb()方法 */
private synchronized void bb(){
nbTemp ++;
if(nbTemp > (byte)2 && isFirst) {
isFirst = false;
long nlEnd = nsMinTime + nlStartTime - System.currentTimeMillis();
if(nlEnd > 0 && nlEnd < nsMinTime) {
try {
76 Thread.sleep(nlEnd);
} catch (InterruptedException e) {}
78 } finish(); // 条件达成,执行finish();
}
}
多线程并行请求问题及SplashActivity预加载问题解决方案的更多相关文章
- 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理
FluentScheduler介绍 github地址:https://github.com/fluentscheduler/FluentScheduler FluentScheduler是一个简单的任 ...
- InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式
InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...
- Javascript图片预加载详解
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
- IIS初始化(预加载),解决第一次访问慢,程序池被回收问题
你以为你可以慢,那是不可能的!你以为你可以不动,那也是不可能的! 河南是守株待兔故事情节的发源地,讲的是懒惰的农夫坐在树桩旁等待可爱的小毛兔撞树的故事,那么这种事情怎么可能天天出现呢!你以为的事并一定 ...
- ViewPager+Fragment取消预加载(延迟加载)(转)
原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...
- js图片预加载
图片预加载有大体有几种方式 1.html标签或css加载图片. 显而易见我们使用img标签或者通过标签的background-image属性都可以实现图片的预加载.但是为了避免初次载入过多图片影响体验 ...
- 利用简洁的图片预加载组件提升h5移动页面的用户体验
在做h5移动页面,相信大家一定碰到过页面已经打开,但是里面的图片还未加载出来的情况,这种问题虽然不影响页面的功能,但是不利于用户体验.抛开网速的原因,解决这个问题有多方面的思路:最基本的,要从http ...
- ASP.NET MVC3 Razor 调试与预加载
目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载 在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...
- JS实现图片预加载无需等待
网站开发时经常需要在某个页面需要实现对大量图片的浏览;用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考 ...
随机推荐
- 1030 Travel Plan (30分)(dijkstra 具有多种决定因素)
A traveler's map gives the distances between cities along the highways, together with the cost of ea ...
- ArrayList 迭代器学习笔记
我们先来看一段代码: List<String> list = new ArrayList<>(); list.add("str1"); list.add(& ...
- Git应用详解第二讲:Git删除、修改、撤销操作
前言 前情提要:Git应用详解第一讲:Git分区,配置与日志 在第一讲中我们对Git进行了简单的入门介绍,相信聪明的你已经了解Git的基本使用了. 这一讲我们来进一步深入学习Git应用,着重介绍Git ...
- 加密采矿僵尸网路病毒还在蔓延! kinsing kdevtmpfsi redis yarn docker
Hadoop yarn 加密采矿僵尸网路病毒还在继续蔓延! 解决步骤 如果你同样遇到了kdevtmpfsi异常进程,占用了非常高的CPU和出网带宽,影响到了你的正常业务,建议使用以下步骤解决 杀掉异常 ...
- Array(数组)对象-->sort() 方法
1.定义和用法 sort() 方法用于对数组的元素进行排序. 默认排序顺序为按字母升序. 语法: array.sort(sortfunction) 参数: sortfunction:规定排序顺序.必须 ...
- 二、Centos7—U盘启动盘制作
1,准备一个8gU盘. 2.iso系统镜像文件. 3.下载UltraISO软件制作启动盘. 4.运行UltraISO软件 5.在UltraISO软件中打开刚下载的Centos系统安装文件 6.开始 ...
- 【Selenium06篇】python+selenium实现Web自动化:日志处理
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第六篇博 ...
- AJ学IOS(54)多线程网络之NSOperation重要知识
AJ分享,必须精品 一:队列的类型与队列添加任务 1: 主队列 [NSOperationQueue mainQueue] 添加到”主队列”中的操作,都会放到主线程中执行. 2:非主队列 [[NSOpe ...
- Hadoop学习笔记(2)-HDFS的基本操作(Shell命令)
在这里我给大家继续分享一些关于HDFS分布式文件的经验哈,其中包括一些hdfs的基本的shell命令的操作,再加上hdfs java程序设计.在前面我已经写了关于如何去搭建hadoop这样一个大数据平 ...
- springboot前后端分离跨域
@Configurationpublic class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMa ...