两个有关问题:一个线程,一个集合类
两个问题:一个线程,一个集合类1.c1.start()c2.start()c3.start()c1.join()c2.join()c3.join()三个线
两个问题:一个线程,一个集合类
1. c1.start();c2.start();c3.start();
c1.join();c2.join();c3.join();
三个线程,同时调用join方法,那是不是c1先运行完然后再运行c2,然后再运行c3??还是JVM有选择权,从三个中选一个。。。
2. SuperClass m=new ChildClass();
CollectionSuperClass<Father> c=new CollectionSuperClass<Child>();
假设存在这四个类,然后分别new出来m和c这两个对象,第一个不会报错,因为是父类引用指向子类对象,但是第二个就会报错,需要类型转换,我 不懂为什么第二个需要转换。。。这两个有什么区别??
求牛人。。。。
[解决办法]
第一个 问题就是当执行 c1.join()时,主线程就等待这个c1线程执行,下面的语句暂时执行不了。但 c2和c3都已经启动,所以 后台运行不受影响。所以这时的情况是: 主线程不执行,c1,c2,c3在执行。
当c1线程执行完后,主线程继续执行c2.join()(如果这时c2结束了,就继续执行c3.join())。主线程继续等待c2结束,但此时c2,c3还在运行。
[解决办法]
没选择的权力。
c1.start();c2.start();c3.start();
c1.join();c2.join();c3.join(); 都是在主线程中。 所以是按照先后顺序来的。
但是对于c1、c2、c3 中的run方法,哪个先执行,那就是不确定的了。就算你在控制台看到 c2 是最先输出的,c1.start(); 这行代码也是先执行的。
第二个问题。
如果用泛型的话,两边的类型要一样,如果你想父类引用子类,可以换种写法。
CollectionSuperClass<? extends Father> c=new CollectionSuperClass<Child>();
这样就不会报错了。
[解决办法]泛型原来可以这样写。。。。
[解决办法]引用:
引用:引用:第一个 问题就是当执行 c1.join()时,主线程就等待这个c1线程执行,下面的语句暂时执行不了。但 c2和c3都已经启动,所以 后台运行不受影响。所以这时的情况是: 主线程不执行,c1,c2,c3在执行。
当c1线程执行完后,主线程继续执行c2.join()(如果这时c2结束了,……