public class DemoThread {
  public static void main(String[] args)
  {
   ThreadTest runnable = new ThreadTest();	 //声明一个Runnable子类对象
    new Thread(runnable).start();	 //创建四个线程,它们使用的是同一资源
    new Thread(runnable).start();
   new Thread(runnable).start();
   new Thread(runnable).start();
  }
}
//实现一个Runnable子类
public class ThreadTest implements Runnable {
 int tickets=100;
 String str = new String();    //定义一个锁旗标
 public void run()
 {
   while(true)
   {
    synchronized(str)
    {
     if(tickets>0)
     {
      try
      {
       Thread.sleep(1000);
      }
      catch(Exception e)
      {
       e.printStackTrace();
      }
      System.out.println(Thread.currentThread().getName()+" is saling tickets"+tickets--);
     }
    }
   }
 }
}public class DemoThread {
  public static void main(String[] args)
  {
   ThreadTest runnable = new ThreadTest();	 //声明一个Runnable子类对象
    new Thread(runnable).start();	 //创建四个线程,它们使用的是同一资源
    new Thread(runnable).start();
   new Thread(runnable).start();
   new Thread(runnable).start();
  }
}public class ThreadTest implements Runnable
{
 int tickets=100;
 public void run()
 {
   while(true)
   {
    sale();
   }
 }
 public synchronized void  sale()
 {
   if(tickets>0)
   {
    try
    {
     Thread.sleep(1000);
    }
    catch(Exception e)
    {
     e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" is saling tickets"+tickets--);
   }
 }
}
public class A {
 synchronized void foo(B b)
 {
  String name = Thread.currentThread().getName();	//获取当前线程的名称
  System.out.println(name+"enter A.foo");
  try
  {
   Thread.sleep(100);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  System.out.println(name+" is trying to call b.last");
  b.last();
 }
 synchronized  void last()
 {
  System.out.println("inside A.last");
 }
}public class B {
 synchronized void bar(A a)
 {
  String name = Thread.currentThread().getName();	//获取当前线程的名称
  System.out.println(name+"enter B.bar");
  try
  {
   Thread.sleep(100);
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  System.out.println(name+" is trying to call b.last");
  a.last();
 }
 synchronized  void last()
 {
  System.out.println("inside B.last");
 }
}public class BlockRunnable implements Runnable
{
 A a=new A();	 //创建一个A类对象
 B b=new B();	 //创建一个B类对象
 BlockRunnable()  //构造方法
 {
  Thread.currentThread().setName("MainThread");	 //设置主线程名字
  new Thread(this).start();	 //创建并启动一个子线程
  a.foo(b);	 //主线程中调用a类的foo方法,foo方法试图调用B类的bar方法
  System.out.println("back in the Main thread");
 }
 public void run() {
  Thread.currentThread().setName("ChildThread");
  b.bar(a);
  System.out.println("back in the ChildThread");
 }
 //主
 public static void main(String[] args)
 {
  new BlockRunnable();
 }
}原文:http://blog.csdn.net/u012637501/article/details/43125207