インタビューの質問-コンテナを実装し、2つのメソッドを提供し、追加、サイズ* 2つのスレッドを書き込み、スレッド1はコンテナに10個の要素を追加し、スレッド2は監視要素の数を認識します。数が5に達すると、スレッド2はプロンプトを表示して終了します。

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(); 

    } 

}

おすすめ

転載: blog.csdn.net/huzhiliayanghao/article/details/106648786