因爲工程有一個需求,什麼需求? 恩,就是須要將一個iterable 在多核狀態下運行。如今已有的方案是,wrapper iterable,即對Iterable進行封裝,將iterable 對象做爲封裝類的私有成員,而後爲其寫一個 Synchronized method 或者 Synchronized block,實現對next()函數的惟一訪問權。這裏推薦 Synchronized block,由於前者會帶來Dos 問題(怎麼會?在文章裏有說明)java
class A { Iterable<T> iter; prive Object lock;public next() { T result; Synchronized(lock) { T= iter.hasnext()? iter.next(): null; } return T;
} }
上述代碼中可能存在語法錯誤的,但大體意思表達到了,時間有限,後期補充。安全
可是,上述問題只是解決了多線程下iterable的線程安全。沒有解決多核同時訪問itreable 這個問題。用google搜了一下,不少都推薦使用 java 8 的stream的parallel。懵啊。。。好吧,開始學習stream是什麼鬼東西。多線程
首先,利用睡前一個小時的時間,中英文blogs同時出發,看了一下大概,明白了stream 的數據來源、中間轉換和終止狀態問題。大體明白了怎麼回事。可是一直糾結,可不能夠用本身定義的類型(class),可不可使用本身定義的函數,怎麼使用? 睡前想了想,總結前面看mvn的經驗——不能一直看網上的blog 介紹,由於不成系統,只能作到管中窺象,不能對其造成總體認知,得看官方manual或者教科書。放心的睡去。然而,清早起牀發現,網上根本沒有這類資料。好吧,從新看blogs,同時,根據本身的須要,開始編寫一些簡單的程序。上程序:app
// stream_hello.java
//package com.mkyong.java8; import java.util.stream.Collectors; import java.util.Arrays; import java.util.Map; import java.util.List; import java.util.function.Function; import java.util.Collection; public class stream_hello { private static final class Task { private final Integer points; Task(final Integer points) { this.points=points; } public Integer getPoints() { System.out.println("threadId="+Thread.currentThread().getId()+ " "+points); return points; } public Integer println() { System.out.println(); return points; } public String toString() { return String.format("[%d]",points); } } public static void main(String [] args) { System.out.println("single thread stream-List"); List<String> items=Arrays.asList("apple","apple","banana","apple","orange","banana","papaya"); Map<String, Long> result=items.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting())); System.out.println(result); System.out.println(); System.out.println("single thread stream-Task"); final Collection<Task> tasks=Arrays.asList( new Task(5), new Task(4), new Task(5)); final long totalPoint=tasks .stream() .filter(Task-> Task.getPoints() >4) .filter(Task->Task.println()>4) .mapToInt(Task::getPoints) .sum(); System.out.println("Total points:"+totalPoint); System.out.println(); System.out.println("Multi thread "); final Collection<Task> tasks2=Arrays.asList( new Task(5), new Task(4), new Task(5)); final long totalPoint2=tasks2 .stream() .parallel() .map(Task->Task.getPoints()) .reduce(0,Integer::sum); System.out.println("Total points:"+totalPoint2); System.out.println(); } }
編譯以下: javac stream_example.java 獲得 stream_example.classide
運行以下: java stream_example函數
運行結果:學習
single thread stream-List {papaya=1, orange=1, banana=2, apple=3} single thread stream-Task threadId=1 5 threadId=1 5 threadId=1 4 threadId=1 5 threadId=1 5 Total points:10 Multi thread threadId=10 5 threadId=9 5 threadId=1 4 Total points:14
經過上述代碼,有對string進行stream,對本身定義的類做爲元素進行stream, 對本身定義的類做爲元素進行多核stream。this
我當前的認知以下: 能夠本身定義元素,定義元素的數據成員,定義元素的方法,該方法的返回結果能夠做爲filter,map等函數的參考標準。google
filter、map等函數都是根據必定條件對stream進行轉換。spa
注意: stream parallel 的多核採用的是fork/join poll.
PS:鑑於一些知識,我想和你們分享。因此,之後有些blogs我會發表在隨筆中。