並行プログラミング - コレクション

通常のコレクション

一覧\設定\地図、同時環境は、プロセスが許可されていませんトラバーサル更新操作(追加と削除)

輸入はjava.util.ArrayList;
インポートするjava.util.Iterator;
輸入はjava.util.List; 

パブリック クラスCollectionDemo {
     公共 静的 ボイドメイン(文字列[]引数){ 
        リスト <ユーザー>リスト= 新規のArrayList <> ();
        以下のためにint型 i = 0; I ++; iは20 < ){ 
            ユーザーユーザ = 新しいユーザー(I、 "USER" + i)を、
            list.add(ユーザ)。
        } 
        // java.util.ConcurrentModificationExceptionが
 //         イテレータ<ユーザー>は、それが(list.iteratorを=)。
//         一方(it.hasNext()){
 //             ユーザーユーザーit.next =();
 //             IF( "User6" .equals(user.getName()))
 //                 list.remove(ユーザ);
 //         } 

        のためのint型 I = 0; Iは、20 <であり; Iは++ ){
             IF(I%2 == 0 ){ 
                ユーザーユーザー = (ユーザー)List.get(I);
 //                     すべての要素を削除し、後者は転送するの一つの位置3が混乱、2となる
                。list.remove(ユーザー)
            } 
        } 
        System.err.println(一覧); 
    } 
}

並行コレクション

非ブロックセット(ノンブロッキングコレクション)ConcurrentLinkedDeque

このコレクションはまた、削除やデータを追加する方法を含みます。この方法は、すぐに実行できない場合は、nullを返したり、例外をスローしますが、この方法は、呼び出し元のスレッドがブロックされているではありません。

リストに大量のデータを追加します。

同じリストから大量のデータを削除します。

 

輸入java.util.concurrent.ConcurrentLinkedDeque。

パブリック クラスCollectionDemo01 {
     公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 
        ConcurrentLinkedDeque = <文字列>リストを新しいConcurrentLinkedDeque()。
        // 添加数据 
        スレッド[] =追加新しいスレッド[100 ]。
        以下のためにint型、iは0 = <100; I ++のこと){ 
            [i]を追加 = 新しいスレッド(() - > {
                 ためINT J = 0; J <10000; jは++){ 
                    。list.add(にThread.currentThread()のgetName() + "要素" + J)。
                } 
            })。
            追加[I] .start(); 
            追加[I] .join()。
        } 
        のSystem.out.println( "後のサイズを追加します。" + はlist.size())。

        // 移除数据

        スレッド[]世論調査 = 新しいスレッド[100 ];
        以下のためにint型、iは0 <100; iは++ ){ 
            ポーリング[i]は = 新しいスレッド(() - > {
                 ためのint型 J = 0; J <5000; J ++){
                    list.pollLast(); 
                    list.pollFirst(); 
                } 
            })。
            ポーリング[I] .start(); 
            ポーリング[I] .join()。
        } 
        のSystem.out.println( "投票後のサイズ:" + はlist.size())。
    } 
}

コレクションを遮断(ブロッキングコレクション)LinkedBlockingDeque

セットブロッキング(コレクションブロッキング):セットは、このようなデータを追加し、除去することを含みます。コレクションがいっぱいまたは空である場合には、追加または削除メソッドと呼ばれ、すぐに実行できない場合、メソッドが正常に実行することが可能になるまでスレッドがブロックされます。このメソッドを呼び出します。

 

輸入java.util.Date;
輸入java.util.concurrent.LinkedBlockingDeque。
輸入java.util.concurrent.TimeUnit。

パブリック クラスBlockDequeDemo {
     公共 静的 ボイドメイン(文字列[]引数){ 
        LinkedBlockingDeque <ストリング>リスト= 新しい LinkedBlockingDeque(3 )。
        スレッドのスレッド = 新しいスレッド(() - > {
             ためint型 i = 0; iは<3; I ++ ){
                 ためのint型 J = 0; J <5; J ++ ){
                    文字列str  =新しい文字列(I + ":" + J)。
                    試す{ 
                        list.put(str.toString())。
                    } キャッチ(InterruptedExceptionある電子){ 
                        e.printStackTrace(); 
                    } 
                    のSystem.out.println( "クライアント:" + STR +(新しい日付())); 
                } 
            } 
        })。
        thread.start(); 

        以下のためにint型、iは5 <; I = 0 iは++ ){
             ためint型 J = 0; J <3; J ++){
                 試みる {
                    文字列str = )(list.takeします。
                    System.out.println( "メイン:取る"+ STR +"サイズ:" + はlist.size()); 
                } キャッチ(InterruptedExceptionある電子){ 
                    e.printStackTrace(); 
                } 
                試みる{ 
                    TimeUnit.SECONDS.sleep( 3 )。
                } キャッチ(InterruptedExceptionある電子){ 
                    e.printStackTrace(); 
                } 
            } 
        } 

        のSystem.out.println( "終了" )。

    }
}

 

輸入com.sun.javafx.animation.TickCalculation。

輸入java.util.Randomの。
輸入java.util.concurrent.Semaphore。
輸入java.util.concurrent.TimeUnit。

パブリック クラスCarDemo {
     公共 静的 ボイドメイン(文字列[]引数){
         // 创建セマフォ 
        セマフォSP = 新しいセマフォ(5 )。

        スレッド[]車 = 新しいスレッド[10 ]。
        以下のためにint型、iはi = 0 <10; iは++ ){ 
            車[I] = 新しいスレッド(() - >{
                 // 要求許可
                試し{ 
                    sp.acquire(); 
                    System.out.printlnは(。にThread.currentThread()のgetName() + "は駐車場に入ることができます" ); 
                } キャッチ(InterruptedExceptionあるE){ 
                    e.printStackTrace(); 
                } 

                // リソース
                のtry {
                     int型ヴァル= 新しい新しいランダム()nextInt(10 ); 
                    TimeUnit.SECONDS.sleep(ヴァル); 
                    。System.out.printlnは(にThread.currentThread()のgetName() + "滞在" +ヴァル+ "S" ); 
                } キャッチ(InterruptedExceptionあるE){ 
                    e.printStackTrace(); 
                } 
                // 離れ(リソース解放)

                試し{ 

                    sp.release(); 
                    System.out.printlnは(。にThread.currentThread()のgetName() + "駐車場を離れます" ); 
                } キャッチ(例外E){ 
                    e.printStackTrace(); 
                } 
            }、 "CAR [" + I + "]" ); 
            CAR [I] .start(); 
        } 


    } 
}

 

 

ArrayBlockingQueue  
のConcurrentHashMap  
ConcurrentLinkedQueue  
ConcurrentSkipListMapの 
ConcurrentSkipListSetの 
CopyOnWriteArrayListと 
CopyOnWriteArraySet

おすすめ

転載: www.cnblogs.com/yintingting/p/11428575.html