A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 漫步人 中级黑马   /  2013-10-25 09:41  /  1353 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. class Printer implements Runnable {
  2.   private static int taskCount;
  3.   private final int id = taskCount++;
  4.   Printer() {
  5.     System.out.println("Printer started, ID = " + id);
  6.   }
  7.   public void run() {
  8.     System.out.println("Stage 1..., ID = " + id);   这里的id应该如何理解啊??final型不是只能赋一次值嘛,怎么结果会显示0,1,2,3,??
  9.     Thread.yield();
  10.     System.out.println("Stage 2..., ID = " + id);
  11.     Thread.yield();
  12.     System.out.println("Stage 3..., ID = " + id);
  13.     Thread.yield();
  14.     System.out.println("Printer ended, ID = " + id);
  15.   }
  16. }

  17. public class E01_Runnable {
  18.   public static void main(String[] args) {
  19.     for(int i = 1; i < 5; i++)
  20.       new Thread(new Printer()).start();
  21.   }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
因为static的关系,static为静态修饰符,静态变量static taskCount 在第一个线程启用后,其taskCount 的值并不是零,应为在给id 赋值的时候taskCount++ 了。虽然id为最终常量值,但每次线程启动,就重新又生成 final int id ,所以并不是id的值改变了,而是新的常量id

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
其实原因就在你的for循环上  
for(int i = 1; i < 5; i++)
    new Thread(new Printer()).start();
  }

你在这里连续开启了四个线程而且是针对不同对象,也就是你开启四个线程时是针对的四个不同对象,被static修饰的变量是被对象所共享的,当你第四次循环时,那 taskCount也累加了四次,并不是你对final,重新赋值了而是你在四个对象中,对id赋值了四次,而final在这四个对象中的值是不同的,你的这个id分别属于,四个不同对象而且相互直接没有影响,所以不存在重新赋值的问题,你把程序改成下面那样
Printer p=new Printer();
    for(int i = 1; i < 5; i++)
      new Thread(p).start();
  }
针对一个对象操作,id的值肯定是同一个,或者你把id也用static修饰,那它的值也会是相同的

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 qixing0918 于 2013-10-25 14:16 编辑

for(int i = 1; i < 5; i++)

new Thread(new Printer()).start();
}  
这句是建5个printer 类
5个类都有final  final 是不变的
只是 static 全局变量给他赋不同的值而已(final 初始化赋值)


评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
这里是由于每次main函数进行一次for循环,都会启动一个新的线程(new Printer()),所以,对应的对象调用final的值(id的值)其实一直是唯一的,所以final int id在同一个对象的调用中并没有改变;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马