Upload
oracle-fusion-middleware
View
30.227
Download
1
Embed Size (px)
DESCRIPTION
This explain the new feature of Java SE 7.Project Coin, NIO.2, Fork/Join, invokeDynamic and so on.
Citation preview
<Insert Picture Here>
Java SE 7 で切り開く新しい Java の世界について 日本オラクル株式会社 Fusion Middleware 事業統括本部 シニア Java エバンジェリスト 寺田 佳央 ブログ: http://yoshio3.com (本日の資料は後日ブログで公開します)
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
アジェンダ
3
7 はじめに プロジェクト Coin Java NIO.2 Da Vinci Machine Peoject Fork/Join フレームワーク 国際化関連
クラスローダの拡張
ネットワークプロトコルの追加サポート まとめ
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
はじめに
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
自己紹介寺田 佳央 ‒ http://yoshio3.com • 2001 年 日本サン・マイクロシステムズ株式会社入社 • Java/GlassFish Evangelist • Software Ambassador • 日本 GlassFish ユーザグループ
• 2010 年 日本オラクル株式会社入社 • Java エバンジェリスト • Java SE/EE の啓蒙活動を中心
• ブログ、Twitter 等の SNS • http://yoshio3.com, @yoshioterada
5
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 6
Oracle は今後も積極的に Java に投資します。
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Oracle の Java に対する姿勢
7
"Java is the single most important software asset we have ever acquired." 「Java は私たちが今までに取得した中で 最も重要なソフトウェア資産です。」
– Larry Ellison
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 8
7革命 進化
1996 � 1997 � 1998 � 2000 � 2002 � 2004 � 2006 � 2011� 2012 �
1.0�
1.1�
1.2�
1.3� 1.4�
5.0�
6 8
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 9
2011年7月7日
Java SE 7 リリース
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 10
7Project Coin (JSR 334) NIO.2 (JSR 203) Fork/Join Framework InvokeDynamic (JSR 292)
• クラスローダの拡張 • 国際化の拡張
• Unicode 6.0 • IETF BCP47, UTR 35 • ISO 4217 通貨コード • Locale の拡張
• URLClassLoader のクローズ
• SDP & SCTP • セキュリティの拡張
• TLS 1.2 • ECC
• Swing JLayer • XRender Pipeline for Java 2D(X11環境) • JDBC 4.1
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 11
プロジェクトCoin 言語仕様に関する小さな変更
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
プロジェクトCoin言語仕様に関する小さな改良
• switch構文における文字列の使用 • 数値表現形式の追加 • バイナリ数値表現の追加 • 数値表現における”_”の使用が可能 (可読性の向上)
• 例外ハンドリングの改良 • 例外のマルチキャッチ • 例外の再送
• ジェネリックなインスタンス生成のための型推論の改善 • プロジェクト diamond
• リソースを含む try 構文 • 単純化された可変引数メソッドの呼び出し
12
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
switch構文における文字列の使用
String s = “”; switch(s){ case “true”: doTrue();
break;
case “false”: doFalse(); break;
default:
doDefault();
break;
}
13
• switch 構文における文字列(String)の使用
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
数値表現形式の追加
• バイナリ表記 • 1 (10進表記) • 01 (8進表記) • 0x1 (16進表記) • 0b1 (バイナリ表記)
• “_”(アンダースコア)表記 • 数値表現中に”_”を記載し意味ある単位に分割可能 • 可読性の向上を目的として追加された仕様 • 内部的には処理前に、replaceAll(“_”,””)で “_”が排除
14
byte data = (byte)0b00100001
(8bitのバイト表示)
long creditCardNumber = 1234_5678_9012_3456L;
int binryData = 0b1001_1001;
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
例外ハンドリングの改良マルチキャッチ • Java SE 6 の例外キャッチ
15
try{
… }catch(FileNotFoundException fnfe){
}catch(IOException ioe){
}
try{
… }catch(FileNotFoundException|IOException ex){ ex.printStackTrace();
}
• Java SE 7 の例外キャッチ(複数の例外をキャッチ可能)
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
例外ハンドリングの改良例外の再送-JDK 6まで • try ブロック中で発生した例外を再送する場合 • Exception の親クラスThrowableでキャッチ • Throwableのインスタンスをthrow
• 問題 • メソッドの定義で”throw Throwable”が必要
16
try {
… } catch (Throwable ex) {
logger.log(ex);
throw ex;//throw Throwable を宣言しない場合コンパイルエラー
}
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
例外ハンドリングの改良例外の再送-JDK 7 • try ブロック中で発生した例外を再送する場合 • Exception の親クラス Throwable を final 指定でキャッチ • メソッドの定義で”throw Throwable”が不要 • try ブロック中で発生する例外のみ再送可能
17
try {
… } catch (final Throwable ex) { logger.log(ex);
throw ex
}
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Genericsインスタンス生成にける型推論の改善
• Java SE 6 まで
18
Map<String, String> map = new HashMap<String, String>(); Map<String, Map<Integer, String>> map = new HashMap<String, Map<Integer, String>>();
Map<String, String> map = new HashMap<>(); Map<String, Map<Integer, String>> map = new HashMap<>();
• Java SE 7 から
• Generics における型安全性の保証は強力 • インスタンス生成時の冗長的な記述は可読性が低下
• <>”ダイヤモンド”を記述し可読性が向上
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
リソースを含む try 構文 • try で Closeable インタフェースの実装クラスを記述 • finaly で close 処理の記述が不要 • 自動的にリソースのclose() が実行
19
private static void copyFile(File source, File target) { try (InputStream fin = new FileInputStream(source); OutputStream fout = new FileOutputStream(target)){
byte[] buf = new byte[8192];
int i;
while ((i = fin.read(buf)) != -1) {
fout.write(buf, 0, i);
}
}catch (Exception e) {
e.printStackTrace();
}
}
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java NIO.2 関連
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
JSR 203: NIO.2More New I/O APIs for the Java™ Platform • JSR 51: New I/O APIs for the Java™ Platformの改良 API • 新規ファイルシステム API を提供 • 便利なファイル操作処理が追加
• 新しいディレクトリ、ファイル表現クラス (Path) を提供 • ファイル属性、権限の取得・設定 API を提供 • ディレクトリツリーの走査用 API を提供 • ディレクトリ中の変更通知機能 API を提供 • 非同期 I/O の改善
21
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java NIO.2 適用の利点
• パフォーマンスの大幅な改善
22
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java NIO.2 適用の利点
Java NIO.2 適用前 全ファイルシステムを同一視で処理
ファイルシステムの走査が不可
ファイル操作APIが欠如 シンボリックリンクの未サポート
ファイル属性の読み書き処理が不可
ファイル権限の処理が不可
適切な例外ハンドリングが不可
ファイルシステムの変更通知が不可
非同期I/Oのサポート不足 zip ファイル操作用APIの不足
Java NIO.2 適用後 ファイルシステム用のAPI を提供 ファイルツリーによる走査が可
ファイル操作用API (コピー、削除、移動等) シンボリックリンクをサポート
ファイル属性を扱う事が可能
ファイル権限を扱う事が可能
適切な例外ハンドリングが可能
ファイルシステムの変更通知が可能
非同期 I/O をサポート
zip をファイルシステムとして処理可能
23
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ファイルシステム API • NIO.2 主要パッケージ • java.nio.file • java.nio.file.attribute • java.nio.file.spi
• FileSystem クラス • ファイルシステムに対するインタフェースを提供 • ファイルシステム中のファイル・ディレクトリにアクセスするオブジェクトのファクトリメソッドを提供
• デフォルトのファイルシステムを取得:getDefault() • Path インタフェース • ファイルシステム中のファイル、ディレクトリを表現 • java.io.File と java.nio.file.Path の双方向変換 • java.io.File#toPath() 、java.nio.file.Path#toFile() を使用
24
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
FileSystems から FileSystem の生成例java.nio.file.FileSystems, java.nio.file.FileSystem
��� FileSystem fSystem = FileSystems.getDefault();! Path path1 = fSystem.getPath("/var/tmp/README.txt");! try(BufferedReader reader = ! Files.newBufferedReader(path1,! Charset.forName("UTF-8"))) {! String line;! while ((line = reader.readLine()) != null)! System.out.println(line);! } catch (IOException ioe) {! ioe.printStackTrace();! }
25
FileSystemsファクトリメソッドからデフォルトFileSystemオブジェクトを生成
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Paths クラスから Path インスタンスの生成例java.nio.file.Paths, java.nio.file.Path
26
Path path1 = Paths.get("/var","tmp","README.txt");! Path path2 = Paths.get(URI.create("file:///var/tmp/README.txt"));! Path path3 = Paths.get(System.getProperty("user.home"),"README.txt");
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Path の操作例Path に関する情報取得
27
Path path = Paths.get("/var","tmp","README.txt");! System.out.format("toString: %s%n", path.toString());! System.out.format("getFileName: %s%n", path.getFileName());! System.out.format("getName(0): %s%n", path.getName(0));! System.out.format("getNameCount: %d%n", path.getNameCount());! System.out.format("subpath(0,2): %s%n", path.subpath(0,2));! System.out.format("getParent: %s%n", path.getParent());! System.out.format("getRoot: %s%n", path.getRoot());
toString: /var/tmp/README.txt! getFileName: README.txt //ファイル名の取得! getName(0): var //Path オブジェクトの 0番目の要素を表示! getNameCount: 3 //Path オブジェクトの要素数! subpath(0,2): var/tmp //指定された要素のパス! getParent: /var/tmp //親ディレクトリ! getRoot: / //ルートディレクトリ
じk�実行例:
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Path の操作例ドット表記の削除-カレント(.)、親ディレクトリ(..)
28
Path path = Paths.get(URI.create(”! file:///var/test/../tmp/README.txt")); ! Path norm = path.normalize();! System.out.format("path.toString: %s%n", ! path.toString());! System.out.format("norm.toString: %s%n", ! norm.toString());
path.toString: /var/test/../tmp/README.txt! norm.toString: /var/tmp/README.txt
実行例:
※ normalize() メソッドは実際のファイルの存在の有無はチェックしない表記のみ
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Path の操作例ドット表記の削除-カレント(.)、親ディレクトリ(..)
29
Path path2 = Paths.get("../","var","test","README.txt"); ! try{! Path real = path2.toRealPath(true);! System.out.format("real.toString: %s%n", real.toString());! }catch(java.nio.file.NoSuchFileException | IOException ioe){! ioe.printStackTrace();! }!
��� real.toString: /var/test/README.txt
実行例:
※ toRealpath() メソッドは実際のファイルの存在をチェック
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Path の操作例相対パスの取得
30
Path path = Paths.get("/var/tmp/foo");! Path path2 = Paths.get("/var/tmp/bar");!! Path fooToBar = path.relativize(path2);! System.out.format("fooToBar.toString: %s%n", ! fooToBar.toString());
fooToBar.toString: ../bar
実行例:
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ファイル操作用 APIjava.nio.file.Files クラス • クラス中のメソッドは全てクラス (static) メソッド • ファイル、ディレクトリ、シンボリックリンク等を操作 • 基本操作 • 作成(ディレクトリ作成、ファイル作成、シンボリック作成、テンポラリディレクトリ作成、テンポラリファイル作成)、コピー、削除、移動、存在有無の確認、ディレクトリの走査等
• 属性関連 • 全ファイル属性の読み込み、属性の更新、属性取得、最終更新日付の取得、オーナーの取得、権限の取得、ディレクトリの存在確認、実行可能権限の確認、読み込み権限の確認、書き込み可能権限の確認、ファイルサイズの取得等
• 読み書き • バイト単位、行単位の読み書き処理等
31
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ディレクトリの作成例java.nio.file.Files#createDirectory
32
public class CreateDirectory{! public static void main(String argv[]){! Path directory = Paths.get("/var/tmp/dir");! try{! Files.createDirectory(directory);! }catch(IOException ioe){! ioe.printStackTrace();! }! }! }
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
追加書き込みモードでファイルのオープンjava.nio.Files#newOutputStream
33
Path textFile = Paths.get("C:\\test.txt");! try(OutputStream out = Files.newOutputStream(textFile, ! StandardOpenOption.APPEND);! BufferedWriter bout = new BufferedWriter(! new OutputStreamWriter(out,"UTF-8"))){! bout.write("ADDITIONAL TEXT\n");! }catch(IOException e){! System.err.println(e);! }!
newOutputStream(path,OpenOption) に APPEND を指定してオープン
try-with-resource 構文を使用し close の記述も不要
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ファイルのコピー例java.nio.file.Files#copy
34
try{! from = new FileInputStream(sourceFile);! to = new FileOutputStream(toFile);! byte[] buffer = new byte[4096];! int byteRead;! while((byteRead = from.read(buffer)) != -1)! to.write(buffer,0,byteRead);!} catch(IOException){} finally{! …! } ※ Java SE 6 までのコピーコード例
FileSystem local = FileSystems.getDefault();! Path from = local.getPath(sourceFile);! Path to = local.getPath(toFile);! Files.copy(from, to, REPLACE_EXISTING); !
NIO.2 の利用例
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
シンボリックリンクの作成java.nio.Files#createSymbolicLink
35
Path target = Paths.get("/tmp/source.txt");! Path newLink = Paths.get("/tmp/symbolic.txt");! try{! Files.createSymbolicLink(newLink, target);! }catch(IOException | UnsupportedOperationException e){! System.err.println(e);! }!
※ シンボリックリンクをサポートしない環境で実行した場合
java.lang.UnsupportedOperationException:
Symbolic links not supported on this operating system
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ディレクトリツリーの走査java.nio.Files#walkFileTree • 起点パスから指定した深さの階層までディレクトリを走査 • ファイル・ディレクトリに対してFileVisitor のメソッドを実行 • postVisitDirectory, preVisitDirectory, visitFile, visitFileFailed
36
final FileSystem fs = FileSystems.getDefault();! Path startPath = fs.getPath(startDir);! SimpleFileVisitor visitor = new SimpleFileVisitor<Path>(){! @Override! public FileVisitResult visitFile(Path file, ! BasicFileAttributes attr) throws IOException{! PathMatcher matcher = fs.getPathMatcher("glob:*.txt");! if(matcher.matches(file.getFileName()))! System.out.println(file.toAbsolutePath());! return super.visitFile(file, attr);! }};! Files.walkFileTree(startPath, visitor);!
指定したディレクトリ配下に存在するテキストファイルを絶対パスで出力
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ファイルシステムの変更通知
• ネィティブなファイルシステム監視サービスを提供 • OS が提供するネィティブ機能を利用するため低オーバヘッド • OS が機能を提供しない場合 Java 内で実装(低パフォーマンス)
• WatchService インタフェース • OS の差異を吸収するインタフェース
• Watchable インタフェース • Path クラスで Wathable インタフェースを実装 • register メソッドで WatchService と取得したいイベントを登録 • イベントタイプ(作成、削除、変更など)
• WatchKey インタフェース • WatchService が登録された Watchable オブジェクトのキー • Watchable によって伝搬された伝搬されたイベントを処理 • イベントのポーリング、イベントの取得、削除
37
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ファイルシステムの変更通知
38
FileSystem fs = FileSystems.getDefault();! WatchService ws = fs.newWatchService();! Path path = fs.getPath("C:\\tmp");! path.register(ws, StandardWatchEventKind.ENTRY_CREATE, ! StandardWatchEventKind.ENTRY_DELETE, ! StandardWatchEventKind.ENTRY_MODIFY);! for (;;) {! WatchKey key = ws.take();! List<WatchEvent<?>> events = key.pollEvents();! for (WatchEvent obj : events) {! System.out.println(obj.kind().name()+ "\tFileName: " ! + obj.context().toString());! }! key.reset();! }!
ファイルシステム固有のサービス取得
特定のパス配下の変更通知イベントを登録
キューに存在する WatchKey の取得と削除
キーに紐ずく全保留イベントの取得
次の変更通知を検知するためリセットし再度キューイング
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ストレージ情報の取得FileStore クラス
39
FileSystem fs = FileSystems.getDefault();! for(FileStore fstore: FileSystems.getDefault().getFileStores()){! long total = fstore.getTotalSpace() / 1024 ;! long used = (fstore.getTotalSpace() – ! fstore.getUnallocatedSpace()) / 1024 ;! long available = fstore.getUsableSpace() / 1024 ;! System.out.format(“%-15s %10d %14d %16d %n”,! fstore,total,used,available);! }! }!
• ストレージ(デバイス、パーティション、ボリューム)の情報取得 • ファイルが存在するストレージ情報、全ストレージ情報取得 • FileStore.getFileStore(path), FileSystems.getDefault().getFileStores();
全ストレージ情報の取得例
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 40
Da Vinci Machine Project JSR 292:
Supporting Dynamically Typed
Languages on the JavaTM Platform
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
今までの Java プラットフォーム
Java言語で実装されたアプリケーションの実行環境
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
マルチ言語プラットフォーム
Java言語以外で実装されたアプリの動作も可能
今後の Java プラットフォーム
Python�
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 43
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java 仮想マシン言語仕様 1997
• The Java Virtual Machine knows nothing about the Java programming language, only of a particular binary format, the class file format.
• A class file contains Java Virtual Machine instructions (or bytecodes) and a symbol table, as well as other ancillary information.
• Any language with functionality that can be expressed in terms of a valid class file can be hosted by the Java virtual machine.
• Attracted by a generally available, machine-independent platform, implementors of other languages are turning to the Java Virtual Machine as a delivery vehicle for their languages.
• In the future, we will consider bounded extensions to the Java Virtual Machine to provide better support for other languages.
将来、他言語をサポートするため JavaVM の拡張を検討する
44
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Invokedynamic バイトコード命令の追加 java.lang.invoke
• JavaVM がより柔軟なメソッド呼び出しを可能にし動的言語をより動作させやすくするバイトコード命令
• 動的言語の開発者はメソッドに含まれるターゲットタイプを指定せず、メソッド呼び出しをバイトコードに記述する事が可能
• 型情報を後から与える事が可能 • Invokedyanamic 命令の構文
• Invokedynamic <メソッド名、記述子> <n> • 記述子:戻り値の型と引数
45
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Reflection より高速な MethodHandlejava.lang.invoke.MethodHandle
• 新しい動的リンクメカニズムの提供 • MethodHandle :invokedyanamic のバイトコード命令に対するレスポンス中で正しいメソッド呼び出しを行う
• Reflection より実行オーバヘッドが少で高速実行が可能
• MethodHandle 使用時には下記2オプションを追加(Dev Preview時) • -XX:+UnlockExperimentalVMOptions -XX:+EnableMethodHandles
46
������ MethodType mt;! MethodHandle mh;! MethodHandles.Lookup lookup = MethodHandles.lookup();! mt = MethodType.methodType(String.class, char.class, ! char.class);! mh = lookup.findVirtual(String.class, "replace", mt); ! String s = (String) mh.invokeExact("daddy",'d','n'); ! System.out.println(s);!
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
JSR-166y
Java Concurrency Util
Fork/Join フレームワーク
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java Concurrency UtilitiesJSR-166 ができるまで • Java SE 1.4 まで並列処理の実装は困難 • wait(), notify(), synchronized() は機能として十分 • アプリケーションに低レベル API での実装を要求 • 正しい実装は困難 • 間違いが発生しやすい • 間違えた実装によりパフォーマンスの低下
48
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java Concurrency UtilitiesJSR-166 の目標 • 並列処理の実装を容易に • 幅広く再利用可能な並列処理用の API を提供 • スケーラビリティ、パフォーマンス、メンテナンス性、可読性の向上、スレッドセーフ実装
49
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
マルチコア CPU を有効活用可能CPU 数を取得しスレッド数を決定
50
//使用可能なプロセッサ数を取得! int threadNum = Runtime.getRuntime().availableProcessors();! //CPU 分のスレッドプールを生成! ExecutorService pool =! Executors.newFixedThreadPool(threadNum);!
マルチコアの CPU を最大限に活用可能
マルチコア CPU の利用状況
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java SE 7 で導入Fork/Join フレームワークの概念
• 大きな問題を細かい問題に分割し、分割した問題を個別に解決した後、最後に結果を集計
51
大きな問題
細かい
問題
細かい
問題
細かい 問題�
個別
処理
個別
処理
個別
処理
結合した結果
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
マージソートの実装例Fork/Join を使用しない場合
52
class MergeSort{ ! public int[] sort(int[] all){! if (all.length == 1) { ! return all;! } else { ! int[] left = new int[all.length/2]; ! System.arraycopy(all,0,left,0,left.length]; ! int[] right = new int[all.length – left.length];! System.arraycopy(all,left.length,right,! 0,right.length);! left = sort(left); ! right = sort(right); ! merge(left,right,all); ! return all;! }! }}!
左右の再帰処理を
別スレッドで実現したい
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
マージソートの実装例Fork/Join を使用しない場合
53
public class MergeSort{ ! public int[] sort(int[] all){! int threads = Runtime.getRuntime().availableProcessors();! ForkJoinExecutor pool = new ForkJoinPool(threads); ! SortImpl sort = new SortImpl(all); ! pool.invoke(sort); ! return sort.result;!}!private class SortImpl extends RecursiveAction{ ! private int[] all; ! private int[] result;!
SortImpl(int all){ ! this.all = all;! }! 次ページへ続く …!
ForkJoinPoolの生成と
コンカレントスレッドで実行
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
マージソートの実装例Fork/Join を使用しない場合
54
protected void compute(){ ! if ((all.length < 10 )) {! result = sequentialSort(all); ! } else {! int[] left = new int[all.length/2]; ! System.arraycopy(all,0,left,0,left.length); ! int[] right = new int[all.length – left.length];! System.arraycopy(all,left.length,right,0,right.length);! SortImpl task1 = new SortImp(left); ! SortImpl task2 = new SortImp(right); ! invokeAll(task1,task2); ! left = task1.result;! right = task2.result; ! merge(left,right,all); ! result = all;! }}!
タスク分割の閾値を設定
十分小さい場合は逐次処理
閾値が小さいすぎると並列化のオーバヘッドが増加
タスクを分割し実行
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
国際化関連
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Unicode 6.0 のサポート
• Java SE 6 : Unicode 4.0 準拠 • Java SE 7 : Unicode 6.0 準拠 • Unicode 6 • http://www.unicode.org/versions/Unicode6.0.0/ • Unicode 5.1 から 2,088 個の追加文字 • 携帯電話で特に重要な1,000を超える記号追加 • http://unicode.org/Public/UNIDATA/EmojiSources.txt
• 新しい公式インド通貨記号:インドルピー記号 • 222文字の中国、台湾、日本で共通に使われるCJK統合漢字文字追加
• 603文字のアフリカ言語サポートのための文字追加 • ティフィナグ文字、エチオピア文字、バムン文字への拡張
• 3つの文字体系追加: マンダ文字、バタク文字、ブラーフミー文字
56
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ISO 4217 通貨コードの拡張をサポート
• 通貨コードの更新に JRE のアップデート再インストールは不要 • 今までは通貨コードデータが JRE の jar に含まれていたため通貨コードの更新には JRE 自身を更新するしか方法はなかった
• デフォルトの通貨コードを上書き可能 • <JAVA_HOME>/lib/currency.properties ファイルを用意 • ISO 3166 で定義される国コードと ISO 4217 の通貨コードをキー/値のペアで設定
• 通貨コードはアルファベットコード、数値コード、マイナーユニットで構成 • 日本の通貨コード設定例: JP=JPZ,999,0
• java.util.Currency クラスに追加されたメソッド • getAvailableCurrencies : 利用可能な全通貨コードの取得 • getNumericCode:インスタンスの ISO 4217 数値コードの取得 • getDisplayName:デフォルトロケールの通貨コードの表示名を取得 • getDisplayName:指定したロケールの通貨コードの表示名を取得
57
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
その他の国際化関連の機能
• java.util.Locale.Category 列挙型の追加 • ロケール設定時に“表示用データ (DISPLAY) ”と、“日付、数値、通貨データ (FORMAT)”を分けて使用可能
• Locale クラスにおける BCP47, UTR35 のサポート • java.awt.font.NumericShaper.Range 列挙型の追加 • 正規表現で Unicode のポイントを検索可能 • Perl 形式も可能: • String hexPattern = "\x{" + Integer.toHexString(codePoint) + "}";
58
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
クラスローダの拡張
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
クラスローダの機能強化
• Bug ID: 4670071 の対応 • バグ登録日:2002/4/17 • 修正対応版:Java SE 7 ビルド 47(2009/Q1)
• バグの概要 • 特定のカスタムクラスローダにおいてデッドロックが発生
• 修正前 • ロードするクラス名に関係なくクラスローダをロック • 複数のスレッドから関連するクラスを呼び出す際にデッドロックが発生
• 修正後 • ロードするクラス名とクラスローダの対でロック • デッロック問題は消滅 • 参考:http://tinyurl.com/6xln947, http://tinyurl.com/64lx7p7
60
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
ネットワークプロトコルの追加サポート
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
SCTPStream Control Transmission Protocol • SCTP はトランスポート層のプロトコル • IPネットワーク上で電話網の制御信号を転送するため開発
• TCP, UDP に類似、弱点を改善し高信頼 • マルチホーミング • 両端接続で複数のIPを利用可能)
• マルチストリーミング • 一つのストリームで複数ストリーム配信
• パッケージ • com.sun.nio.sctp パッケージ • SctpChannel クラス、SctpServerChannel クラス • 利用可能だが Java SE の通常パッケージには含まれない
62
アプリケーション層
プレゼンテーション層
セッション層
トランスポート層
ネットワーク層
データリンク層
物理層
OSI 7 階層モデル
ご参考 URL :
http://tinyurl.com/69vd2oh
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
SDPSockets Direct Protocol • ハイ・パフォーマンス・コンピューティング環境用 • InfiniBand Trade Association によって定義されたプロトコル • Remote Direct Memory Access (RDMA)機能を提供 • ネットワークデータ転送時のパフォーマンスボトルネックを解消
• RDMA • コンピュータメモリに直接アクセスし他のコンピュータに直接書き込み可能 • OS を介さないためハイ・パフォーマンスなデータ転送が可能
• Solaris ・ Linux 環境でサポート • java -Dcom.sun.sdp.conf=sdp.conf -Djava.net.preferIPv4Stack=true MyApplication
• 参考 • http://download.oracle.com/javase/tutorial/sdp/sockets/index.html
63
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
まとめ
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java SE 7(JSR-336) の新機能概要
65
機能 JSR 詳細
仮想マシン JSR-292 動的型言語のサポート (InvokeDynamic)
言語仕様 JSR-334 言語仕様の小規模な拡張 (プロジェクトCoin)
クラスローダの拡張
URLClassLoaderのクローズ
Fork/Join (jsr166y)
国際化 Unicode 6.0
java.util.LocaleのIETF BCP 47 and UTR 35
Locale の拡張
ISO 4217 通貨コードの Extensible サポート
I/O関連 JSR-203 Java NIO. 2
SCTP (Stream Control Transmission Protocol)
SDP (Sockets Direct Protocol)
Use the Windows Vista IPv6 stack
セキュリティ TLS 1.2
楕円曲線暗号
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 66
機能 JSR 詳細
JDBC JDBC 4.1
クライアント XRender pipeline for Java 2D
Create new platform APIs for 6u10 graphics features
Nimbus look-and-feel for Swing
Swing JLayer component
Web Update the XML stack
Java SE 7 の新機能概要
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 67
2011年7月7日
Java SE 7 リリース
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
Java SE の今後
• Java SE のロードマップ • Java SE 7 (JSR-336) : 2011年 7 月7 日 • Java SE 8 (JSR-337) : 2012年 後半
• HotSpot VM と JRockit VM について • 何れの開発も継続します。 • 中~長期的:機能統合を予定しています。
68
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
参考情報
• OpenJDK • http://openjdk.java.net/ • 新機能一覧:http://openjdk.java.net/projects/jdk7/features/
• JDK 7 Project • http://jdk7.java.net/ • JDK 7 API: http://download.java.net/jdk7/docs/api/
• The Java™ Tutorial • http://download.oracle.com/javase/tutorial/
69
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved.
イメージを表示できません。メ
Copyright© 2011, Oracle. All rights reserved. 71