package com.huawei.interview;
public class Multithread{
/**
* @param args
*/
public static void main(String[] args){
//TODO Auto-generated method stub
new Thread(new Threadl()).start();
try{
thread.sleep(10);
}catch(InterruptedException e){
//TODO Auto-generated catch block
e.prinStackTrace();
}
new Thread(new Thread2()).start?();
}
private static class Threadl implements Runnable
{
@override
public void run(){
//TODO Auto-generated method stub
//由于这里的Threadl和下面的Thread2内run方法要用同一对象作为监视器,我们这里不能用this,因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。
synchroized(MultiThread.class){
System.out.println("enter thread1...");
System.out.ptintln("thread1 is waiting");
try{
//释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放放锁。
MultiThread.class.wait();
}catch(InterruptedException e){
//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread1 is going on...");
System.out.println("thread1 is being over!");
}
}
}
private static class Thread2 implements Runnable
{
@Override
public void run(){
//TODO Auto-generated method stub
synchronized (multiThread.class){
System.out.println("thread2 notify other thread can release wait status..");
//由于notify方法并不释放锁,即使thread2调用下面的sleep方法休息了10毫秒,但thread1仍然不会执行,因为thread2没有释放锁,所以thread1无法得不到锁。
MultiThread.class.notify();
System.out.println("htread2 is sleeping tenmillisecond...");
try{
Thread.sleep(10);
}catch(InterruptedException e){
//TODO Auto-generated catch block e.printStackTrace();
}
System.out.ptintln("thread2 is going on...");
System.out.ptintln("thread2 is being over!");
}
}
}
}
云南昆明达内IT软件培训机构,隶属于加拿大外企IT培训集团,提供专业的软件培训:目前开设课程有Java软件培训,Android培训,物联网培训等大学生就业培训项目,与全国上万家知名IT企业签订就业培训协议,是你提升自我技能入职国企、名企的另一个明智之选!
咨询电话:0871-8382257
官方网址:http://www.kmtarena.net