不行,受不了了,我要记录下这个 bug

     我们在使用 java 中使用线程 Thread 的时候,在 run(){  } 里面的如果要传递参数给函数,一般,编译系统都会提示我们,要将这个参数尽可能地设置为 final,即常量,一旦定义就不能再被修改的。

     这样的要求真是极好的!

     除了定义为 final 就不能传了吗?非也,我们可以把 需要传递的变量弄为 global 全局的,但是!!问题往往就是这样出现了。

     大家看下下面这段代码。

 1 for(int u=0;u<result.length;u++){
 2     final int picIndex=u;
 3     final Bitmap bitmap = result[picIndex];
 4     new Thread(new Runnable() {
 5         @Override
 6         public void run() {
 7                InternetHelper.uploadPic
 8                (   // 批量 上传 图片,此静态函数 必须要 加 synchronized
 9                    "http://zzzzzzzz.php?"+"account="+userAccountTemp+"&postid="+userPostId,
10                     bitmap,              //修改之前这里直接用 result[u]
11                     ""+picIndex+".jpg"   //修改之前,picIndex 是全局的
12                );
13          }
14      }).start();
15 }

     这是我项目里面的真实代码,目的是为了把 Bitmap数组 result 里面的bitmap转为 jpg 传递到 服务器,就是上传图片,由于图片不可能是 1张,而且较大,700K左右/张,这是已经尽力压缩的情况了,所以需要多个线程来传。

     在还没有把 picIndex、bitmap 弄为 final之前,说下我遇到的情况,result 里面总是有2张以上的不同图片 bitmap 数据,按照道理,执行完上述代码,共开了两个+线程,上传了两张以上的不同的图片。

     但是,我在服务器里检测的时候,发现总是只上传了一张图片,就是说我把同一张图片,上传了几次!!然后我就开始打印 log 了,分别打印 u、和 bitmap.toString(),发现,在进入 线程之前,都是正常的,即不同。按道理我传递的也是不同的才对。uploadPic 函数是没问题的。

     想了下,我觉得是线程搞的鬼了,它在执行函数内的代码时,还来不及执行完, for 循环已经进行完毕,那么 对应的 参数也就跟着变了,但是等 函数内代码再去内存中取这个数的时候,就取到了 后面的。

     于是乎,把会变得,要传的参数,全改为 final,问题解决。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

gorilla/mux类库解析

golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系。实现简单功...

3898
来自专栏Hongten

Jave Web JSTL(JspServer Pages Standdard Tag Library:JSP标准标签库)

JSTL全名JspServer Pages Standdard Tag Library(Jsp标准标签库),它是sun公司发布的一个针对JSP开发的新组件,它...

631
来自专栏H2Cloud

fflua更新-增加对引用的支持

简介: fflua 发布了有段时间了,很多网友都用了,并且提供了一些很好的反馈。其中一个就是c++接口注册到lua中时,对引用的支持。这样使用起来更加方便。 原...

2806
来自专栏vue学习

小程序 — 实现左滑删除效果(列表)③

首先我们初始化一个list列表并为其添加数据,这个列表有两个值分别为标题文字title和初始的偏移量x:

683
来自专栏自动化测试实战

flask第十一篇——自定义url转换器

2886
来自专栏北京马哥教育

Ansible 详细用法说明(二)

例:获取某台主机的变量 ansible 10.1.6.68 -m setup ===================================== sc...

2885
来自专栏java达人

jsp中的JSTL与EL表达式用法及区别(二)

JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out、set、remove、catch 2.流程控制标签:if、choose、whe...

3058
来自专栏H2Cloud

C++中消息自动派发之一 About JSON

1. 闲序   游戏服务器之间通信大多采用异步消息通信。而消息打包常用格式有:google protobuff,facebook thrift, 千千万万种自定...

2253
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版第二章coredump捕获环境配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

351
来自专栏SeanCheney的专栏

《Learning Scrapy》(中文版)第2章 理解HTML和XPath使用Chrome浏览器获得XPath表达式常见工作提前应对网页发生改变

为了从网页提取信息,了解网页的结构是非常必要的。我们会快速学习HTML、HTML的树结构和用来筛选网页信息的XPath。 HTML、DOM树结构和XPath 从...

28512

扫码关注云+社区