// lock 练习 public class LockTest{ public static void main(String[] args) { // TODO Auto-generated method stub new LockTest().init(); } private void init(){ final Outputer out=new Outputer(); new Thread( new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.output4("English"); } } } ).start(); new Thread( new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.output4("Chinese"); } } } ).start(); } //使用各种 同步锁对象 this,.class ,Object ,Lock static class Outputer{ Lock lock=new ReentrantLock(); public void output4(String name){ int len=name.length(); lock.lock(); //使用 jdk 1.5 提供的锁 try { for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } catch (Exception e) { // TODO: handle exception }finally{ lock.unlock(); } } } }
//condition
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** *父子线程 交替打印10 次, 100次 * @author Bin */ public class ConditionCommunication { static boolean isSubRun=true; /** * @param args */ public static void main(String[] args) { /*new Thread( new Runnable() { @Override public void run() { int num=0; synchronized (TraditionalThreadCommunication.class) { while (num<=4) { if(!isSubRun){ try { TraditionalThreadCommunication.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+" run "+i); } isSubRun=false; TraditionalThreadCommunication.class.notify(); num++; } } } } ).start(); new Thread( new Runnable(){ @Override public void run() { int num=0; while(num<=4){ synchronized (TraditionalThreadCommunication.class) { if(isSubRun){ try { TraditionalThreadCommunication.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName()+" run "+i); } isSubRun=true; TraditionalThreadCommunication.class.notify(); num++; } } } } ).start();*/ final Business bus=new ConditionCommunication().new Business(); new Thread(){ @Override public void run() { for (int i = 1; i < 5; i++) { bus.sub(i); } } }.start(); new Thread(new Runnable(){ @Override public void run() { for (int i = 1; i < 5; i++) { bus.main(i); } } }).start(); } class Business{ Lock lock=new ReentrantLock(); Condition condition=lock.newCondition(); private boolean sShouldSub=true; public void sub(int i){ //synchronzied 有 lock 替代 lock.lock(); try { if(!sShouldSub){ //这里换成 while try { //this.wait(); condition.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 1; j <= 10; j++) { System.out.println("Sub thread sequence of "+j+" loop of"+i); } sShouldSub=false; //this.notify(); condition.signal(); } finally{ lock.unlock(); } } public void main(int i){ lock.lock(); try { while(sShouldSub){//这里换成while 比 if 更 安全 健壮 try { //this.wait(); condition.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int j = 0; j < 100; j++) { System.out.println("Main thread sequence of "+j+" loop of"+i); } sShouldSub=true; //this.notify(); condition.signal(); } finally{ lock.unlock(); } } } }