2 qpqpwj qpqpwj 于 2016.09.12 11:13 提问

Java Thread Runnable run

请问 为什么主函数中的User eclipse 会提示修改成 final 修饰
class User {
public void A(){
for (int i = 0; i >0 ; i--) {
System.out.println(i);
}
}
public void B(){
for (int i = 0; i >0 ; i--) {
System.out.println(i);
}
}
}

public class TestThread {
public static void main(String[] args) {
final User u = new User();
Thread t1 = new Thread(new Runnable(){public void run(){u.A();}});
Thread t2 = new Thread(new Runnable(){public void run(){u.B();}});

}

}

2个回答

bdmh
bdmh   Ds   Rxr 2016.09.12 11:15

异步中修改外部对象,会导致不同步,造成数据错误,所以建议你改成final,保证对象是不会被修改的

zhuzige521888
zhuzige521888   2016.09.12 14:51

1.因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
2.这么写也不会有问题。
Thread t1 = new Thread(new Runnable(){public void run(){User u = new User();u.A();}});
Thread t2 = new Thread(new Runnable(){public void run(){User u = new User();u.B();}});

zhuzige521888
zhuzige521888 new Runnable(){public void run(){u.A();}}这就是一个内部类,User u 是外部变量。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
JAVA多线程—传统线程机制-运行Thread.run()还是Runnable.run()
问题:如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,那么,线程运行时的执行代码是子类的run方法的代码?还是Runnable对象的run方法的代码? 示例代码:public class TraditionalThread { public static void main(String[] args) { Runn
通过JDK源码解析Thread(Runable target ...)调用的是哪个run方法
如下代码段 1: new Thread(new Runnable() { @Override public void run() { System.out.println("Run of Runnable"); } }) { public void run() { System.out.println("Run of Thread"); } }.start(); 执行上述
Java中thread的run()/start()方法以及Runnable接口
Runnable是接口,我们可以通过实现Runnable接口来创建新的线程并启动。 new Thread(new MyRunnable()).start() run()方法它是Runnable接口的一个方法,我们可以通过它定义需要执行什么样的操作。 start()是启动线程的方法。 Thread Test = new Thread(); Test.start(); 下面是一个例子:
线程的两种创建方式:Thread类和Runnable接口,它们都要复写run方法
/*线程: * 1.如何在自定义的代码中,自定义一个线程呢? * * 通过对API的查找,java已提供了对线程这类事物的描述。就是Thread类 * * 创建线程的第一种方式:继承Thread类。 * 步骤: * 1.定义类继承Thread。 * 2.复写Thread中的run方法,让线程运行。 * 目的:将自定义方法存储在run方法中,让线程运行。 * 3.调用线程
学习java多线程的笔记1--Thread(Runnable t)与重写run()方法等
今天看了看《Java2核心技术卷II:高级特性》中的--多线程--这一篇,还有看了张孝祥老师的Java多线程与并发库高级应用视频。顺便做个笔记,方便以后复习一下java相关知识: 关于线程Thread类中的  Thread(Runnable target) 构造方法的使用 代码一: package cn.yang.thread; public class ThradTest2 {
使用匿名内部类实现线程,new Thread(new Runnable(){}) 和 new Thread(){}
就是利用匿名内部类实现,补充下,做个笔记吧 import java.util.Date; public class ThreadInnerClass { /** * @主要看使用内部类怎样实现一个线程 */ public static void main(String[] args) { // TODO Auto-generated method stub new Thr
JAVA多线程之Runnable和Thread比较
在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些线程,当问题比简单时一个或者几个线程就OK了,也涉及不到效率问题。一旦线程数量多起来的时候,必然躲不过这些线程的创建与销毁,而往往这是很浪费时间的。这时就需要利用线程池来进行管理,既免去了我们创建线程
匿名内部类中关于new Runnable()的使用
匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口   1、继承一个父类的匿名内部类实现: abstract class People { public abstract void eat(); } public class Demo { public s
Java 中多线程的实现方法之Thread和Runnable
【该博文摘抄于百度知道,原文链接为:http://zhidao.baidu.com/question/164816755.html?fr=ala&word=java%E4%B8%AD%E7%9A%84%E5%A4%9A 在此表示对作者辛勤付出的感谢】 1、 认识Thread和Runnable Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是
多线程 : Thread 与 Runnable 内Run方法优先级
例子代码: new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }) { @Override public void run() { // TODO Auto-generated method stub