在安卓中开启一个新线程,发现如下代码中if块是DeadCode?为什么,如何解决?

new Thread(){
public void run(){
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(hasData < 100){
progressStatus = progressStatus + (int)(Math.random() * 10);
handler.sendEmptyMessage(0x123);
// if(hasData >= 100){
// Toast.makeText(MainActivity.this,"耗时任务已完成",1).show();
// }
}

        }
    }.start();
}
备注progressStatus和handler已经在上面声明了。
0

3个回答

 while(hasData < 100){
progressStatus = progressStatus + (int)(Math.random() * 10);
handler.sendEmptyMessage(0x123);
// if(hasData >= 100){
// Toast.makeText(MainActivity.this,"耗时任务已完成",1).show();
// }
}

从这块代码分析可知,有几种情况:
1.如果原先 hasData >= 100的话,根本就不会进入到这个while循环中,那么就不会执行if
2.如果原先hasData < 100 , 那么会进入到while中,但是while中没有改变hasData值的方法,那么只会在while中死循环,永远不会执行if
3.如果原先hasData < 100,那么会进入到while中,而且通过handler.sendEmptyMessage(0x123);发送的请求,会改变hasData的值,但是,由于handler的执行相比当前thread是异步的,其触发时机会存在不确定性,所以不知道hasData的值会是在while判断前改变还是在if判断钱改变,所以也会导致if里面的内容不起作用

1

while(hasData < 100)
所以>=100不可能发生

0

逻辑错误,就像这样:
if(true) {
if(false) {
//Are you just kidding me?
}
}

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
静态初始化块里启动新线程的陷阱
静态初始化块里启动新线程的陷阱 一:问题的提出           我们知道静态块帮助我们完成一些类的初始化的工作,那么在静态块里面启动一个线程,让它来帮助我们来完成初始化的工作会发生什么哪?死锁还是输出了让我们感觉不是我们想要的结果呐?,不妨试试看,结果是什么吧. 二:具备的知识         多线程的基础知识, 多线程的创建,启动,join()方法和匿名内部类的使用等.例子比较简单的
android开启线程的方法
Thread类代表线程类,它的两个最主要的方法是: run()——包含线程运行时所执行的代码 Start()——用于启动线程public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ma...
android中开启子线程
有些东西是需要总结下了。。。在面试过程中,被问到,如何开启一个子线程的时候。。。脑子里忘得只剩new Thread对象了,还有就是没有意识到自己是否在主线程中做了耗时操作,这些都是很致命的。兜兜转转,还是java基础差惹的祸,咱给补上。AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity Component
Java之dead code——无用代码
dead code无作用的代码   if (true & true) {    System.out.println("execute ok");   } else {    System.out.println("execute fail");   } 从else开始即为无作用。因为true&true在编绎时即知结果,所以else部分是无用的,编译器知道肯定不会执行的代码。 b
Android 中 Activity 的 onCreate 方法里面子线程为何能设置UI界面
如果之前你没有尝试过 onCreate 方法里面用子线程的 run 方法去设置 UI (比如对 Textview 进行 setText 操作),相信你看到这个标题,也会感到困惑和好奇吧。 废话不多说,先来个 Demo 。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta...
Android启动线程的四种方式
Android开发当中,经常都需要开启子线程来进行一些耗时,或者可能产生阻塞的操作。开启子线程主要分开两大方式,继承Thread类,或者是实现runnable类。不多说,看代码: 1、继承Thread类的实现: 首先要写一个子线程类,去继承Thread类,重写run方法 class MyThread extends Thread{ @Override public
android 线程里面再开新的的线程
当 一个线程里面开另外一个线程的时候,需要注意的地方,例如:  @Override                 public void run() {                     // TODO Auto-generated method stub                     mTimeCount++;                     mProgres
Android中Service(服务)和Thread(线程)的关系
一、Service(服务) Service是Android中四大组件之一,在Android开发中起到非常重要的作用,先来看一下官方对Service的定义: A Service is an application component that can perform long-running operations in the background and does not prov
在Activity中开启新线程注意问题
很多人认为,在Activity中new出来的线程,会在Activity销毁的时候线程同时被销毁,事实上,这是一个错误的观点。 Activity new出来的新线程是运行在另非主线程上的,Activity销毁的本质是执行了onDestroy()这个生命周期方法,工作线程不会受到Activity销毁的影响。 当Activity启动的新线程执行的是一个死循环操作的时候,新线程会一直运行着,即使是Act
关于在一个Service事务中开启线程的问题,Spring事务管理源码解读
https://www.cnblogs.com/fishisnow/p/6396989.html Spring事务管理用了ThreadLocal保存多线程的资源隔离,保证并发情况下的线程安全,事务的一致性。
47_Java开启新线程,异步执行代码
new Thread(){ public void run(){ syso(1); } }.start();  
android访问网络,单独开启线程
问题描述:在模拟器上Android应用成功访问本地局域网网络,所有功能正常,于是换到真机上测试结果只能登录成功,后续的操作都是失败的。起初怀疑是否是登录cookie的问题,但是在模拟机上都可以说明不是cookie的问题,真机浏览器可以访问局域网应用。最后想到登录是new了线程的,登录没有问题,但是后面执行网络访问无论如何都访问不到数据,就是因为没有开启新的线程。 问题原因:Android在与服务...
android实现N滴雨(采用onTouchEvent触摸事件和线程)
所以我们需要写一些工具和限制来 这里就创建了一个Rian类 代码如下: package com.example.helloworld; import android.graphics.Canvas; import android.graphics.Paint; public class Rain { private float x = 50;
创建和启动线程的两种方式
方式1:继承Thread类 步骤: 1):定义一个类A继承于java.lang.Thread类. 2):在A类中覆盖Thread类中的run方法. 3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体. 4):在main方法(线程)中,创建线程对象,并启动线程. (1)创建线程类对象:                 A类   a  =  new   A类();
java方法中启动一个新的线程
1 要想在java方法中启动一个新的线程。通过new Thread(){public void run(){...}}.start()即可。 如:public static void main(String[] args) { System.out.println("新建议一个线程"); //启动一个新的线程 new Thread(){ public void run(){ Sys
Android 开启新线程
Android 开启新线程标签(空格分隔): 未分类Android 开启新线程 直接创建子线程并启动 先创建线程然后启动 开启新的线程2种简单常用的方法:① 直接创建子线程,并启动;private Thread newThread; //声明一个子线程 new Thread() { @Override public void run() {
Android 中三种启用线程的方法
在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢?   首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。   而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。
Android 的网络请求需要开辟子线程的原因 +程序实例
原因总结如下 1、为了避免导致UI卡顿的情况:比如在OnCreate 里面先进行网络请求然后还要加载布局 。 2、在Android4.0以后,在主线程中的HTTP请求,运行时都会报错 ANRs (“Application Not Responding”),”应用没有响应“。  所以:当进行网络请求的时候 还是需要开辟一个子线程,然后等到数据返回成功后再刷新UI 一个
Android常用的开启子线程的方法
参考:https://www.cnblogs.com/propheterLiu/p/6082666.html        Google在Android4.0之后,禁止主线程访问网络,是为了更好的用户体验。也就是主线程是为了界面的显示。如果主线程访问网络,就会造成“卡顿”。也就是对于网络状况的不可预见性,很有可能在网络访问的时候造成阻塞,那么这样一来我们的主线程UI线程就会出现假死的现象,产生很不...
C#开启新线程
using System; using System.Threading; public static void Main(string[] args){ Thread t=new Thread(DownLoadFile_My);//创建了线程还未开启 t.Start(&quot;http://abc/def/**...
android新开一个单线程的后台线程
private Executor singleThreadExecutor = Executors.newSingleThreadExecutor(); singleThreadExecutor.execute(new Runnable() { @Override public void run() { });
java开启新线程的三种方法
见:http://blog.csdn.net/caidie_huang/article/details/52748460 见:http://blog.csdn.net/typename/article/details/7212512 方式1:继承Thread类 步骤: 1):定义一个类A继承于Java.lang.Thread类. 2):在A类中
Android中直接开线程与使用服务开线程的区别
android中直接开线程与使用服务(Service)开线程两种办法都可以执行长时间任务,它们的区别是什么呢?什么时候使用直接开线程,又什么时候启动服务后,再服务中开线程呢?一个service是一个在用户不与你的应用交互时依然可以运行于后台的简单组件.所以,只有你需要这样做时才创建一个service.如果你需要执行的工作不在主线程中,但是只有用户在与你的应用交互时才进行,那么你可能应该创建一个新的线
解决java Android 中同一个线程多次运行问题
在java中同一个线程只能被start()一次,当第二次start()就会报异常。但是我们的软件需求常常需要同一个线程多执行同一个方法。为此可以使用notify(),wait()方法来达到我们想要的效果。先看代码public class ThreadTest extends Thread { private static boolean flag = false; public Thr
在方法中,开启新线程
https://blog.csdn.net/huangjp_hz/article/details/60745540#t1
JAVA的for循环中i++警告“Dead code”的原因
开发环境:Eclipse 这几天在改bug时发现一个问题,之前没有遇到过,在for循环中的i++部分报错,如图所示: for(int i=0;i&amp;lt;sub.size();i++) { if(sub.get(i).getAmount().equals(dto.getAmount())) { return true; }...
Android 你不知道的Service(服务) & Thread(线程)
Service作为Android的四大组件之一,你或许会经常用它。当提到它时,我们都随口说,它会在后台执行长时间的任务,但是,这种表述真的对么?你是否真的了解Service,就让我们来揭开Service的真面目。ServiceAndroid Developer对于Service如下定义, A Service is an application component that can perform
android 主线程是线程不安全的
# 欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctr
关于单例模式中线程同步的方法(同步块和同步方法)
出于方便,引用了之前单例模式(懒汉模式)的源码进行的改进,做于个人笔记记录 package Sys; /**  * 单例设计模式  * 确保一个类只有一个对象  * @author Administrator  *  */ public class SingletonPattern {  public static void main(String[] args) {
Android 开启子线程简单流程
一直都在用,却没有积累下来,简单的东西还是记一下吧! 1、 private class DownLoadThread extends Thread { @Override public void run() { Message message = new Message(); message.wh
Android中线程的正确使用
最近看到一篇讲解Android线程及其使用的文章,比较详细,在此分享出来,感谢原作者的分享。 ----------------------------- 来源:http://android.jobbole.com/82440/ --------------------------------------- 线程是程序员进阶的一道重要门槛。对于移动开发者来说,“将耗时的任务放到子
java面试(进阶四篇)解答
题目来自于网络,答案是笔者整理的。仅供参考,欢迎指正 来源: https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&amp;amp;mid=2247485779&amp;amp;idx=1&amp;amp;sn=3b06b9923df7f40f887ead8b8a53e50e&amp;amp;chksm=e9c5f0e2deb279f47fbfc3a12a70896bf95fa8c...
线程和fragment
线程类thread和接口Runnable() 接口Runnable()接口只有一个run()方法; Thread类讲run()方法实现为空方法 创建线程的方法: 1.继承Tread类 因为Tread类中的run()方法是空方法,所以继承类中的方法要去实现run()方法; ***在程序中,线程语句的顺序只决定了线程语句产生的顺序,线程产生后并不立即运行,而是和系统中的所有其它线程一起等待
Android4.0网络操作必须放在子线程中
好久没写技术博客了。关于为什么这么久没写,是因为写伤了。写过几篇博客后,深刻感觉到要把博客写好是一件很累的事情,花的时间也肯定不会少。记得前段时间写Android中Activity四种启动模式和taskAffinity属性详解这篇博客,前前后后写了一个星期,从那之后真有点怕写这么长的博客了。所以, 以后尽可能不写这种总结性的,篇幅较长的博客,因为自己水平真的有限,写这种长博客太累, 写了之后别人还
使用委托开启多线程(多线程深入)
转https://blog.csdn.net/qq_34057374/article/details/76460578 1、用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程 BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经...
在javaWeb项目中,在Action中开启新线程的方法!
Action中的其他方法的代码在这里就省略了。只要在Action中加入以下的方法就可以实现在Action中开启一个新的线程了。 //开启一个新的线程 Thread thread = new Thread(new Runnable() { //在run方法中写要执行的代码,如果要和数据库进行连接,就用传统的JDBC @Override public void run() { final
ios中4种开启新的线程的处理方式以及运用范围(多线程)
一、什么是多线程 1. 2. 3. 二、使用多线程的目的是什么 1. 2. 3. 三、ios中有哪几种多线程方式 1. NSThread 1.1 1.2 1.3 2. NSOperation 2.1 2.2 3. GCD 3.1 3.2 四、代码示例 1. NSThread 2. NSOpe
Handler中Runnable 并不是新开一个线程
Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的: Handler mHandler=new Handler(); mHandler.post(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub } }); 官方对这个方
Android--线程详解
什么是线程? 线程或者线程执行本质上就是一串命令(也是程序代码),然后我们把它发送给操作系统执行。 一般来说,我们的CPU在任何时候一个核只能处理一个线程。多核处理器(目前大多数Android设备已经都是多核)顾名思义,就是可以同时处理多线程(通俗地讲就是可以同时处理多件事)。 多核处理与单核多任务处理的实质 上面我说的是一般情况,并不是所有的描述都是一定正确的。因
在Service中新开线程和直接新开线程的区别与意义
转载自: 一、Android的进程与生命周期: Android系统会尽可能长的延续一个应用程序进程,但在内存过低的时候,仍然会不可避免需要移除旧的进程。为决定保留或移除一个进程,Android将每个进程都放入一个“重要性层次”中,依据则是它其中运行着的组件及其状态。重要性最低的进程首先被消灭,然后是较低的,依此类推。重要性共分五层,依据重要性列表如下: (1)前台进程
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java中关于线程的学习 java中线程的学习视频