通常のコレクション
一覧\設定\地図、同時環境は、プロセスが許可されていませんトラバーサル更新操作(追加と削除)
輸入は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