static静态的是多个对象共享的。
因为是多线程,所以我觉得执行的顺序应该是
先new Task()若干个对象出来,这时候
private static int id=0;
private final int threadID=id++;
就已经被赋值了,但是run方法还没有被执行,threadID各个对象之间不影响,但是id是共享的,所以会改变,最后输出值会一样。
然后这若干个对象在一起执行run方法输出。
因为是多线程,所以我觉得执行的顺序应该是
先new Task()若干个对象出来,这时候
private static int id=0;
private final int threadID=id++;
就已经被赋值了,但是run方法还没有被执行,threadID各个对象之间不影响,但是id是共享的,所以会改变,最后输出值会一样。
然后这若干个对象在一起执行run方法输出。
es.execute(new Task());
}会产生10个实例,第一个实例d为0,threadID也为0,由于d为static,第二个实例d为1,threadID为1,以此类推10个实例。
线程池执行实例的start()方法和创建实例的先后没准,你这个是创建好4个实例后,才执行第一个实例的start方法,就会出现:
threadID=0
id=5
线程池是同步的,所以10个线程执行没有先后,就会出现:
threadID=8
id=10
threadID=4
第9个创建的实例执行start后,第5个创建的实例才执行start。如有错误请纠正。
1、id这个变量是一个共享资源,所谓“共享资源”,指的是多个线程可以同时访问的数据结构、文件等信息实体。
2、你这段程序可以分为2段来看,一段是运算,一段是输出。3、你代码中开启了10个线程访问共享资源id,对他进行运算。当第8个线程运算后。
4、第6个和第7个线程运行到输出,但是此时id已经被第8个线程重新计算为9,所以第6个和第7个线程输出的结果是9。代码做了下改动,应该有更好的方法。请参考
package com.test;public class Task implements Runnable {
private static int id = 0;
private int threadID = 0;
public Task() {
} public void run() {
synchronized(this){
threadID = id;
System.out.println("id=" + id++);
System.out.println("threadID=" + threadID);
}
}
}
那岂不是会这样啊:10个实力new 好了,但是10个线程执行顺序不确定,而id会递增顺序输出啊...?
还没代码验证。
那岂不是会这样啊:10个实力new 好了,但是10个线程执行顺序不确定,而id会递增顺序输出啊...?
还没代码验证。
那岂不是会这样啊:10个实力new 好了,但是10个线程执行顺序不确定,而id会递增顺序输出啊...?
还没代码验证。嗯 这么写完后 间接的就编程了 串行的了。