java 多线程同步+通信
程序员文章站
2022-05-28 18:24:21
...
/** *父子线程 交替打印10 次, 100次 如此循环 n次 */ public class TraditionalThreadCommunication { 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 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{ private boolean sShouldSub=true; public synchronized void sub(int i){ if(!sShouldSub){ //这里换成 while 比 if 更安全 , 健壮 try { this.wait(); } catch (InterruptedException 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(); } public synchronized void main(int i){ while(sShouldSub){//这里换成 while 比 if 更安全 , 健壮 try { this.wait(); } 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(); } }