標籤:nts list identity count 認知 資料 通過 int class
由於工程有一個需求,什麼需求? 恩,就是需要將一個iterable 在多核狀態下運行。現在已有的方案是,wrapper iterable,即對Iterable進行封裝,將iterable 對象作為封裝類的私人成員,然後為其寫一個 Synchronized method 或者 Synchronized block,實現對next()函數的唯一訪問權。這裡推薦 Synchronized block,因為前者會帶來Dos 問題(怎麼會?在文章裡有說明)
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,同時,根據自己的需要,開始編寫一些簡單的程式。上程式:
// 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.class
運行如下: java stream_example
運行結果:
single thread stream-List{papaya=1, orange=1, banana=2, apple=3}single thread stream-TaskthreadId=1 5threadId=1 5threadId=1 4threadId=1 5threadId=1 5Total points:10Multi threadthreadId=10 5threadId=9 5threadId=1 4Total points:14
通過上述代碼,有對string進行stream,對自己定義的類作為元素進行stream, 對自己定義的類作為元素進行多核stream。
我當前的認知如下: 可以自己定義元素,定義元素的資料成員,定義元素的方法,該方法的返回結果可以作為filter,map等函數的參考標準。
filter、map等函數都是根據一定條件對stream進行轉換。
PS:鑒於一些知識,我想和大家分享。所以,以後有些blogs我會發表在隨筆中。
Java 8 stream try