不行,受不了了,我要记录下这个 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 条评论
登录 后参与评论

相关文章

来自专栏java思维导图

Vim 命令、操作、快捷键(收藏大全)

以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。

943
来自专栏xingoo, 一个梦想做发明家的程序员

cuda编程知识普及

本帖经过多方整理,大多来自各路书籍《GPGPU编程技术》《cuda高性能》 1 grid 和 block都可以用三元向量来表示: grid的数组元素是bloc...

2846
来自专栏耕耘实录

Linux三大剑客之sed

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢。联系本人:ecsboy(微信),136625317(QQ)...

782
来自专栏Linux驱动

5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction(详解)

本节目标:    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 在裸板程序中(参考stmdb...

2958
来自专栏大内老A

WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[WS标准篇]

元数据实际上是服务终结点的描述,终结点由地址(Address)、绑定(Binding)和契约(Contract)经典的ABC三要素组成。认真阅读过《WCF技术剖...

3609
来自专栏Danny的专栏

【SSH快速进阶】——Struts2数据校验

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

843
来自专栏CDA数据分析师

Python性能调优的一次记录

最近在grahite上看到响应时间变得很长,虽说之前没有特意去优化性能,但是感觉也不应该这么差才对。 ? 我们的服务器框架用的就是我之前开源的 maple,每个...

2046
来自专栏用户画像

Linux grep查找文件中的关键字

版权声明:本文为博主-姜兴琪原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxq0816/article/d...

2531
来自专栏破晓之歌

Django 2.0 新特性 转

2017年12月2日,Django官方发布了2.0版本,成为多年来的第一次大版本提升,那么2.0对广大Django使用者有哪些变化和需要注意的地方呢?

892
来自专栏linux系统运维

shell的特殊符号以及其他命令

2145

扫码关注云+社区