1待機して通知することで実現します
パブリッククラスNotifyFreeLock { 揮発性リストリスト=新しいArrayList <>(); public void add(Object o){ lists.add(0); } public int size(){ return list.size(); } public static void main(String [] args){ NotifyHoldingLock c = new NotifyHoldingLock(); 最終オブジェクトロック= new Object(); new Thread(()-> { synchronized(lock){ System.out.println( "t2 启PIN "); if(c.size()!= 5){ try { lock.wait(); } } catch(InterruptedException e ){ e.printStackTrace(); } System.out.println( "t2結束"); //通知t1继续执行 lock.notify(); } }、 "t2")。start(); { TimeUnit.SECONDS.sleep(1);を試してください。 } catch(InterruptedException e){ e.printStackTrace(); } new Thread(()-> { System.out.println( "t1 启PIN "); 同期(ロック){ for(int i = 0; i <10; i ++){ c.add(new Object()); System.out.println( "add" + i); if(c.size()== 5){ lock.notify(); //ロックを解除し、t2を実行させます { lock.wait();を試してください。 } catch(InterruptedException e){ e.printStackTrace(); } } } } }、 "t1")。start(); } }
2LockSupportで実装
パブリッククラスT_LockSupport2 { 揮発性リストリスト=新しいArrayList <>(); public void add(Object o){ lists.add(o); } public int size(){ return list.size(); } 静的スレッドt1 = null、t2 = null; public static void main(String [] args){ T_LockSupport2 c = new T_LockSupport2(); t1 = new Thread(()-> { System.out.println( "t1 启PIN "); for(int i = 0; i <10; i ++){ c.add(new Object()); System.out。 println( "add" + i); if(c.size()== 5){ LockSupport.unpark(t2); LockSupport.park(); } } System.out.println( "t2結束"); }、 "t2"); { TimeUnit.SECONDS.sleep(1);を試してください。 } catch(InterruptedException e){ e.printStackTrace(); } t2 = new Thread(()-> { LockSupport.park(); System.out.println( "t2結束"); LockSupport.unpark(t1); }、 "t2"); t2.start(); t1.start(); } }
3セマフォで実現
public class T_Semaphore { //許容揮発性、使t2能够得到変形 volatileリストリスト= new ArrayList(); public void add(Object o){ lists.add(o); } public int size(){ return list.size(); } 静的スレッドt1 = null、t2 = null; public static void main(String [] args){ T_Semaphore c = new T_Semaphore(); セマフォs = new Semaphore(1); t1 = new Thread(()-> { try { s.acquire(); for(int i = 0; i <5; i ++){ c.add(new Object()); System.out.println( "add "+ i); } s.release(); } catch(InterruptedException e){ e.printStackTrace(); } t2.start(); { t2.join();を試してください。 } catch(InterruptedException e){ e.printStackTrace(); } try { s.acquire(); for(int i = 5; i <10; i ++){ System.out.println(i); } s.release(); } catch(InterruptedException e){ e.printStackTrace(); } }、 "t1"); t2 = new Thread(()-> { { s.acquire();を試してください。 System.out.println( "t2結束"); s.release(); } catch(InterruptedException e){ e.printStackTrace(); } }、 "t2"); t1.start(); } }
42つのCountDownLatchで実装
パブリッククラスT_CountDownLatch { 揮発性リストリスト= new ArrayList <>(); public void add(Object o){ lists.add(o); } public int size(){ return list.size(); } public static void main(String [] args){ T_CountDownLatch c = new T_CountDownLatch(); CountDownLatchラッチ=新しいCountDownLatch(1); CountDownLatchラッチ2 =新しいCountDownLatch(1); new Thread(()-> { System.out.println( "t2 启PIN "); if(c.size()!= 5){ try { latch.await(); ラッチ2.countDown(); } catch(InterruptedException e){ e.printStackTrace(); } } System.out.println( "t2結束"); }、 "t2")。start(); { TimeUnit.SECONDS.sleep(1);を試してください。 } catch(InterruptedException e){ e.printStackTrace(); } new Thread(()-> { System.out.println( "t1 启PIN "); for(int i = 0; i <10; i ++){ c.add(new Object()); System.out.println ( "追加" + i); if(c.size()== 5){ latch.countDown(); try { latch2.await(); } catch(InterruptedException e){ e.printStackTrace(); } } } }、 "t1")。start(); } }