Java多线程中的final和static
2016-08-12 15:36
316 查看
看Android的多线程发现其实是Java的多线程。我找了一本Java编程思想学习Java的并发机制。写了一个demo,遇到一些问题,虽然最后想明白了,但是也暴露了我的Java基础差劲的事实。之后我会通过写博客的方式来提高Java水平。现在说一下我的问题吧。
问题链接
这个问题最后答案的核心是:
Java的静态变量在应用时只会初始化一次,但是可以多次赋值。
下面贴出两个回答的代码片段来说明这个问题:
Thread.run()和Thread.start()区别
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
问题链接
这个问题最后答案的核心是:
Java的静态变量在应用时只会初始化一次,但是可以多次赋值。
下面贴出两个回答的代码片段来说明这个问题:
static int d=20; final static int STATIC_FINAL_INT=d++; //相当于 static int d=20; final static int STATIC_FINAL_INT=d; d=d+1; //d是静态变量属于类变量,所以第二次及之后不会执行 static int c=20; //STATIC_FINAL_INT 是静态变量,所以其初始语句不会继续执行。 //fina staticl int STATIC_FINAL_INT=d++; //属于初始化,只执行一次,所以STATIC_FINAL_INT的值不会改变; //d=d+1属于STATIC_FINAL_INT的初始化语句,所以不会继续执行。所以d的值不会改变;
static int c=20; final int staticInt=c++; //相当于 static int c=20; final int finalInt=c; c=c+1; //c是静态变量属于类变量,所以第二次及之后不会执行 static int c=20; //finalInt不是静态变量,所以其初始语句会继续执行。 //final int finalInt=c++;属于初始化,不止执行一次, //所以finalInt的值会一直增大; //c=c+1属于finalInt的初始化语句,所以会继续执行。所以c的值一直会一直增大;
Thread.run()和Thread.start()区别
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
相关文章推荐
- 关于 "the serializable class XXX does not declare a static final seriaVersionUID..."的问题
- Static和final
- public,private,final,static的区别
- Final and Static
- 类与对象——final,abstract,this,static,回收垃圾,成员变量的覆盖
- static与final
- 关键字static & final
- final和static的区别
- 接口中定义变量必须为public static final的原因
- Java-小技巧-003-static、final、static final的区别
- Java关键字final、static使用总结
- Java关键字final、static使用总结
- static&&final
- static、this、super、final用法简谈(三)(转帖)
- Java关键字final、static使用总结
- A constructor cannot be abstract, final, native, static or synchronized
- final、static(Java)和const、static(C#)
- static与final
- 關於Eclipse的提示 The serializable class XXXXXX does not declare a static final serialVersionUID field of type long
- Java中static、this、super、final用法简谈(二)