今天有人问了一个线程的问题,然后自己看着看着也不明白了。所以希望大家指导我下,谢谢。代码如下:public class Example
{ public static void main(String args[])
{ People teacher,student;
ComputerSum sum=new ComputerSum();
teacher=new People("老师",200,sum);
student =new People("学生",200,sum);
teacher.start();
student.start();
}
}
class ComputerSum
{ int sum;
public void setSum(int n)
{ sum=n;
}
public int getSum()
{ return sum;
}
}
class People extends Thread
{ int timeLength; //线程休眠的时间长度
ComputerSum sum;
People(String s,int timeLength,ComputerSum sum)
{ setName(s); //调用Thread类的方法setName为线程起个名字
this.timeLength=timeLength;
this.sum=sum;
}
public void run()
{ for(int i=1;i<=5;i++)
{ int m=sum.getSum();
sum.setSum(m+1);
System.out.println("我是"+getName()+",现在的和:"+sum.getSum());
try { sleep(timeLength);
}
catch(InterruptedException e){}
}
}
}teacher和student共享一个ComputerSum对象,我想让它互斥的访问ComputerSum对象里的sum字段.我在ComputerSum的getSum和setSum方法声明前加了synchronized。可是执行的结果不是预期的:
1..2..3..4..5.....10,有的就跳过执行了。请指正,谢谢。
{ public static void main(String args[])
{ People teacher,student;
ComputerSum sum=new ComputerSum();
teacher=new People("老师",200,sum);
student =new People("学生",200,sum);
teacher.start();
student.start();
}
}
class ComputerSum
{ int sum;
public void setSum(int n)
{ sum=n;
}
public int getSum()
{ return sum;
}
}
class People extends Thread
{ int timeLength; //线程休眠的时间长度
ComputerSum sum;
People(String s,int timeLength,ComputerSum sum)
{ setName(s); //调用Thread类的方法setName为线程起个名字
this.timeLength=timeLength;
this.sum=sum;
}
public void run()
{ for(int i=1;i<=5;i++)
{ int m=sum.getSum();
sum.setSum(m+1);
System.out.println("我是"+getName()+",现在的和:"+sum.getSum());
try { sleep(timeLength);
}
catch(InterruptedException e){}
}
}
}teacher和student共享一个ComputerSum对象,我想让它互斥的访问ComputerSum对象里的sum字段.我在ComputerSum的getSum和setSum方法声明前加了synchronized。可是执行的结果不是预期的:
1..2..3..4..5.....10,有的就跳过执行了。请指正,谢谢。
public static void main(String args[]) {
People teacher, student;
ComputerSum sum = new ComputerSum();
teacher = new People("老师", 3, sum);
student = new People("学生", 1, sum);
teacher.start();
student.start();
}
}class ComputerSum {
int sum; public synchronized int setSum(int n) {
sum = n + sum;
return sum;
}}class People extends Thread {
int timeLength; // 线程休眠的时间长度
ComputerSum sum; People(String s, int timeLength, ComputerSum sum) {
setName(s); // 调用Thread类的方法setName为线程起个名字
this.timeLength = timeLength;
this.sum = sum;
} public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("我是" + getName() + ",现在的和:" + sum.setSum(1));
try {
sleep(timeLength);
} catch (InterruptedException e) {
}
}
}
}
public void run() {
for (int i = 1; i <= 5; i++) {
try {
sleep(timeLength);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (sum) {
int m = sum.getSum(); sum.setSum(m + 1);
System.out.println("我是" + getName() + ",现在的和:" + sum.getSum()); }
}
}
我是老师,现在的和:1
我是学生,现在的和:2
我是老师,现在的和:3
我是学生,现在的和:4
我是老师,现在的和:5
我是学生,现在的和:6
我是老师,现在的和:7
我是学生,现在的和:8
我是老师,现在的和:9
我是学生,现在的和:10