上码:
package com.hxsmart.thread.synchronize;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class CleanRoom {
private Integer student=0;
private Integer machine=0;
public String getDateStr(){
return " Thread"+Thread.currentThread().getName()+" *time: "+new SimpleDateFormat("mm:ss").format(new Date());
}
public void stuClean(){
System.out.println("enter stuClean");
synchronized (student) {
for(int i=0;i<5;i++){
System.out.println("stu"+getDateStr());
student++;
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void macClean(){
System.out.println("enter macClean");
synchronized (machine) {
for(int i=0;i<5;i++){
System.out.println("mac"+getDateStr());
machine++;
// try {
// TimeUnit.SECONDS.sleep(3);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
}
public static void main(String[] args) {
CleanRoom c=new CleanRoom();
StuThread t1=new StuThread(c);
MacThread t2=new MacThread(c);
t1.start();
t2.start();
}
public Integer getStudent() {
return student;
}
public void setStudent(Integer student) {
this.student = student;
}
public Integer getMachine() {
return machine;
}
public void setMachine(Integer machine) {
this.machine = machine;
}
}
class StuThread extends Thread{
CleanRoom clean;
public StuThread() {
super();
}
public StuThread(CleanRoom clean) {
super();
this.clean = clean;
}
@Override
public void run() {
//for(int i=0;i<5;i++)
clean.stuClean();
System.out.println("stu: "+clean.getStudent()+"** mac:**"+clean.getMachine());
}
public CleanRoom getClean() {
return clean;
}
public void setClean(CleanRoom clean) {
this.clean = clean;
}
}
class MacThread extends Thread{
CleanRoom clean;
public MacThread() {
super();
}
public MacThread(CleanRoom clean) {
super();
this.clean = clean;
}
@Override
public void run() {
//for(int i=0;i<5;i++)
clean.macClean();
System.out.println("stu: "+clean.getStudent()+"** mac:**"+clean.getMachine());
}
public CleanRoom getClean() {
return clean;
}
public void setClean(CleanRoom clean) {
this.clean = clean;
}
}
输出:
enter stuClean enter macClean stu ThreadThread-0 *time: 12:38 stu ThreadThread-0 *time: 12:41 stu ThreadThread-0 *time: 12:44 stu ThreadThread-0 *time: 12:47 stu ThreadThread-0 *time: 12:50 stu: 5** mac:**0 mac ThreadThread-1 *time: 12:53 mac ThreadThread-1 *time: 12:53 mac ThreadThread-1 *time: 12:53 mac ThreadThread-1 *time: 12:53 mac ThreadThread-1 *time: 12:53 stu: 5** mac:**5
问题:
t1和t2线程,分别调用的是CleanRoom类同一实例c的不同方法,并且这两个方法没有把这个实例C锁上,两个方法所锁定的资源分别是c实例的两个不同的属性,按道理来说,这两个线程应该是并发执行的。
但是事实不如此,t2线程在t1线程没有执行完成前,始终处于等待状态。
求解!
当stuClean方法中调用TimeUnit.SECONDS.sleep(3)后,macClean()方法应该有机会得到执行啊?