如这段代码:
class runner{
static Object obj = new Object();
void m(){
synchronized(obj){
for(int i = 0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
synchronized(""){
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
void n(){
synchronized(obj){
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
}
public class Myjava {
public static void main(String args[]){
final runner r = new runner(); //No1:这个地方不明白,为什么要加final
new Thread(){ //No2:这个地方也不明白
public void run(){
r.m();
}
}.start();
new Thread(){
public void run(){
r.n();
}
}.start();
}
}
问题1) 在运行上述代码时,必须要线程1的两个方法m()和n()都运行结束了,线程2的n()方法才能够执行。这是怎么回事?线程1在执行synchronized(obj){}代码块时会把obj锁起来,所以线程2必须等待,这个我懂,但是等线程1的synchronized(obj){}代码块结束之后,这个obj锁就应该解开了吧,所以我觉得线程2此时就应该可以执行synchronized(obj){}代码块了,可为什么一定要等线程1全执行完才行啊?问题2) 在注释1的地方,为什么要加final,我试了一下,不加final就报错,这是为啥?问题30 在注释2的地方,这种new Thread(){ xxxxxxx }的写法算继承还是什么的,记得书上说创建线程就两种方法,一种是定义一个类implements Runnable接口,还有一种就是第一个类extends Thread类,这种写法算上面的哪一种?还有,在new Thread(){}内部的那个run()方法,算是重写么?
class runner{
static Object obj = new Object();
void m(){
synchronized(obj){
for(int i = 0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
synchronized(""){
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
void n(){
synchronized(obj){
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
}
public class Myjava {
public static void main(String args[]){
final runner r = new runner(); //No1:这个地方不明白,为什么要加final
new Thread(){ //No2:这个地方也不明白
public void run(){
r.m();
}
}.start();
new Thread(){
public void run(){
r.n();
}
}.start();
}
}
问题1) 在运行上述代码时,必须要线程1的两个方法m()和n()都运行结束了,线程2的n()方法才能够执行。这是怎么回事?线程1在执行synchronized(obj){}代码块时会把obj锁起来,所以线程2必须等待,这个我懂,但是等线程1的synchronized(obj){}代码块结束之后,这个obj锁就应该解开了吧,所以我觉得线程2此时就应该可以执行synchronized(obj){}代码块了,可为什么一定要等线程1全执行完才行啊?问题2) 在注释1的地方,为什么要加final,我试了一下,不加final就报错,这是为啥?问题30 在注释2的地方,这种new Thread(){ xxxxxxx }的写法算继承还是什么的,记得书上说创建线程就两种方法,一种是定义一个类implements Runnable接口,还有一种就是第一个类extends Thread类,这种写法算上面的哪一种?还有,在new Thread(){}内部的那个run()方法,算是重写么?
No2:线程1的n方法在哪里?
synchronized(obj){
for(int i = 0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
synchronized(""){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
问题2和问题3实际是一个问题,就是内部类的使用,建议楼主看下内部类的相关知识,问题3实际是个匿名内部类,而问题2其实是匿名内部类中使用的变量必须声明为final
2 new Thread(){ xxxxxxx }的写法实际上是实例化了一个Thread对象,而且是个匿名类