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 其他实现方式:

详见 ☞ Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

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预加载问题解决方案的更多相关文章

  1. 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理

    FluentScheduler介绍 github地址:https://github.com/fluentscheduler/FluentScheduler FluentScheduler是一个简单的任 ...

  2. InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

    InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...

  3. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  4. IIS初始化(预加载),解决第一次访问慢,程序池被回收问题

    你以为你可以慢,那是不可能的!你以为你可以不动,那也是不可能的! 河南是守株待兔故事情节的发源地,讲的是懒惰的农夫坐在树桩旁等待可爱的小毛兔撞树的故事,那么这种事情怎么可能天天出现呢!你以为的事并一定 ...

  5. ViewPager+Fragment取消预加载(延迟加载)(转)

    原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...

  6. js图片预加载

    图片预加载有大体有几种方式 1.html标签或css加载图片. 显而易见我们使用img标签或者通过标签的background-image属性都可以实现图片的预加载.但是为了避免初次载入过多图片影响体验 ...

  7. 利用简洁的图片预加载组件提升h5移动页面的用户体验

    在做h5移动页面,相信大家一定碰到过页面已经打开,但是里面的图片还未加载出来的情况,这种问题虽然不影响页面的功能,但是不利于用户体验.抛开网速的原因,解决这个问题有多方面的思路:最基本的,要从http ...

  8. ASP.NET MVC3 Razor 调试与预加载

    目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载   在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...

  9. JS实现图片预加载无需等待

    网站开发时经常需要在某个页面需要实现对大量图片的浏览;用javascript来实现一个图片浏览器,让用户无需等待过长的时间就能看到其他图片 网站开发时经常需要在某个页面需要实现对大量图片的浏览,如果考 ...

随机推荐

  1. 字典树基础进阶全掌握(Trie树、01字典树、后缀自动机、AC自动机)

    字典树 概述     字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...

  2. App 性能测试分享

    在本文内,主要以Android性能测试为主进行分析 一.性能测试包含 1.启动时间测试   测试场景包括 - - - 首次安装启动时间.冷启动.热启动测试 2.页面响应时间:   用户从点击一个控件, ...

  3. Java 网络编程相关知识

    网络的一些基础知识 IP地址分类 IP地址根据网络ID的不同分为5种类型,A类地址.B类地址.C类地址.D类地址和E类地址.A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用 ...

  4. Vim中实现PHP函数tags跳转

    编译安装ctags 下载地址:http://ctags.sourceforge.net/ 下载文件:ctags-5.8.tar.gz 解压ctags:tar -zxcf ctags-5.8.tar.g ...

  5. 详细解析 HBASE 配置的各种要点

    文章更新于:2020-04-06 安装惯例,需要的文件附上链接放在文首. 文件名:hbase-2.2.4-bin.tar.gz 文件大小:213.24 MB 下载链接:http://download. ...

  6. docker go代码编译上传

    一.找需要编译的项目 env GOOS=linux GOARCH=amd64 go build . //编译代码 二.编辑Dockerfile文件, Dcokerfile文件配置: https://w ...

  7. 分享一本Java并发编程的免费好书

    最近当当的大促销又开始了,估计很多人脑子一热,又花钱囤了不少技术书吧. 在我看来大部分程序员买技术书的用途(以下排名按用途从大到小): 让领导.同事看见,你看我多爱学习: 给自己一个心理安慰,我还没废 ...

  8. java集合中的一个移除数据陷阱(遍历集合自身并同时删除被遍历数据)

    下面是网上的其他解释,更能从本质上解释原因:Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁. Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量 ...

  9. shell命令(一)

    什么是shell? Shell是一个应用程序,它连接了用户和Linux内核,让用户能够更加高效.安全.低成本地使用Linux内核,这就是Shell的本质. shell与Linux系统关系图 shell ...

  10. 【python实现卷积神经网络】padding2D层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...