publicclassDemo1implementsRunnable{privatestaticint meters =1000;//共跑1000米@Overridepublicvoidrun(){while(true){synchronized("lock"){//meters修饰的类型为static,当不是同一个对象的时候,每次meters都为初始值System.out.println(Thread.currentThread().getName()+"准备参赛"+"还剩"+meters+"米");if(meters <=200){System.out.println("比赛已结束");break;}go();}return;}}//同步方法:跑步(每人跑100米)publicvoidgo(){System.out.println(Thread.currentThread().getName()+"拿到接力棒!");for(int i =0; i <100; i +=10){try{Thread.sleep(100);}catch(InterruptedException e){
e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"跑了"+(i +10)+"米!");}
meters -=100;}publicstaticvoidmain(String[] args){//8人参加接力赛跑for(int i =1; i <=8; i++){//Demo1 demo1 = new Demo1();// 此处如果用同一个对象,synchronized(this){功能代码块},锁类型可以用this或者继续用类锁//如果不是同一个对象,需要把锁类型换成类锁newThread(newDemo1(), i +"号选手").start();}}}
publicclassMyRunimplementsRunnable{staticint num =10;privateString thread;// Object lock = new Object();publicMyRun(String thread){this.thread = thread;}@Overridepublicvoidrun(){synchronized("lock"){System.out.println(threadName+"拿到了接力棒");
num--;for(int i =1; i <=10; i++){try{Thread.sleep(300);}catch(InterruptedException e){
e.printStackTrace();}System.out.println(threadName+"跑了"+(i*10)+"米");}}}publicstaticvoidmain(String[] args){ExecutorService executorService =Executors.newFixedThreadPool(10);for(int i =0; i <10; i++){MyRun m =newMyRun("线程"+i);
executorService.execute(m);}
executorService.shutdown();}}