• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Java 7 at SoftShake 2011
 

Java 7 at SoftShake 2011

on

  • 956 views

 

Statistics

Views

Total Views
956
Views on SlideShare
809
Embed Views
147

Actions

Likes
0
Downloads
9
Comments
0

8 Embeds 147

http://live.julien.ponge.info 108
http://posterous.com 25
http://twitter.com 3
http://feeds.feedburner.com 3
http://web.archive.org 3
http://paper.li 2
https://twitter.com 2
http://a0.twimg.com 1
More...

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Java 7 at SoftShake 2011 Java 7 at SoftShake 2011 Presentation Transcript

    • Java SE 7 Julien Ponge
    • Fork / Join Project Coin NIO.2 invokedynamic (...)
    • Fork / Join
    • java.lang.Thread java.lang.Runnable wait()<5 notify() synchronized
    • Thread thread = new Thread() { public void run() { System.out.println(">>> Hello!"); }};thread.start();thread.join();
    • java.util.concurrent executors concurrent queues concurrent collections atomic variables5, 6 synchronization patterns rich locks
    • class Sum implements Callable<Long> { private final long from; private final long to; Sum(long from, long to) { this.from = from; this.to = to; } public Long call() { long acc = 0; for (long i = from; i <= to; i++) { acc = acc + i; } return acc; }}
    • ExecutorService executor = Executors.newFixedThreadPool(2);List<Future<Long>> results = executor.invokeAll(asList( new Sum(0, 10), new Sum(100, 1000), new Sum(10000, 1000000)));for (Future<Long> result : results) { System.out.println(result.get());}
    • 1.0 Threads made easy1.11.21.31.4 5 Concurrency made easier 6 7 Parallelism made easier
    • Sum of an arrayn1 n2 n3 n4 n5 n6 n7 n8 n9 ... ... ... ... sum1 sum2 sum3 sum1 + sum2 sum3 + (...) total sum
    • How many occurrences of“java.util.List” in this filesystem tree?
    • Load into RAM (1 thread) Folder Document subfolders: List<Folder> lines: List<String> documents: List<Document> Divide & conquer (#cores threads)
    • ForkJoinPool Your workThread management SplitMaximize parallelism Fork subtasks Work stealing Join subtasks Compose results
    • ForkJoinTask join() join() RecursiveAction fork() fork() vs RecursiveTaskChild ForkJoinTask Child ForkJoinTask
    • 16 Folder word counting task 10 5 1Document word Document word Folder word counting task counting task counting task 3 2 fork() Document word Document word n join() counting task counting task
    • (F/J demo)
    • Speedup&7"6"5"4"3"2"1" 2" 4" 6" 8" 10" 12" #cores
    • No I/ONo synchronization / locksDecompose in simple recursive tasksDo not decompose below a thresholdTake advantage of multicores with no painYou have more F/J candidate algorithms thanyou think!
    • try-with-resources
    • private void writeSomeData() throws IOException { DataOutputStream out = new DataOutputStream(new FileOutputStream("data")); out.writeInt(666); out.writeUTF("Hello"); out.close();}
    • private void writeSomeData() throws IOException { DataOutputStream out = new DataOutputStream(new FileOutputStream("data")); out.writeInt(666); out.writeUTF("Hello"); out.close();} what if...
    • private void writeSomeData() throws IOException { DataOutputStream out = null; try { out = new DataOutputStream(new FileOutputStream("data")); out.writeInt(666); out.writeUTF("Hello"); } finally { if (out != null) { out.close(); } }}
    • private void writeSomeData() throws IOException { DataOutputStream out = null; try { out = new DataOutputStream(new FileOutputStream("data")); out.writeInt(666); out.writeUTF("Hello"); } finally { if (out != null) { out.close(); } }} ...this is still far from correct!
    • try ( FileOutputStream out = new FileOutputStream("output"); FileInputStream in1 = new FileInputStream(“input1”); FileInputStream in2 = new FileInputStream(“input2”)) { // Do something useful with those 3 streams! // out, in1 and in2 will be closed in any case out.write(in1.read()); out.write(in2.read());}
    • public class AutoClose implements AutoCloseable { @Override public void close() { System.out.println(">>> close()"); throw new RuntimeException("Exception in close()"); } public void work() throws MyException { System.out.println(">>> work()"); throw new MyException("Exception in work()"); }}
    • AutoClose autoClose = new AutoClose();try { autoClose.work();} finally { autoClose.close();}
    • AutoClose autoClose = new AutoClose();try { autoClose.work();} finally { autoClose.close();}>>> work() >>> close() java.lang.RuntimeException: Exception in close()        at AutoClose.close(AutoClose.java:6)        at AutoClose.runWithMasking(AutoClose.java:19)        at AutoClose.main(AutoClose.java:52)
    • AutoClose autoClose = new AutoClose();try { autoClose.work();} finally { autoClose.close();} MyException m asked by Run>>> work() time Exception >>> close() java.lang.RuntimeException: Exception in close()        at AutoClose.close(AutoClose.java:6)        at AutoClose.runWithMasking(AutoClose.java:19)        at AutoClose.main(AutoClose.java:52)
    • “Caused by” ≠ “Also happened”
    • AutoClose autoClose = new AutoClose();MyException myException = null;try { autoClose.work();} catch (MyException e) { myException = e; throw e;} finally { if (myException != null) { try { autoClose.close(); } catch (Throwable t) { myException.addSuppressed(t); } } else { autoClose.close(); }}
    • AutoClose autoClose = new AutoClose();MyException myException = null;try { autoClose.work();} catch (MyException e) { myException = e; throw e;} finally { if (myException != null) { try { autoClose.close(); } catch (Throwable t) { myException.addSuppressed(t); } } else { autoClose.close(); }}
    • AutoClose autoClose = new AutoClose();MyException myException = null;try { autoClose.work();} catch (MyException e) { myException = e; throw e;} finally { if (myException != null) { try { autoClose.close(); } catch (Throwable t) { myException.addSuppressed(t); } } else { autoClose.close(); }}
    • AutoClose autoClose = new AutoClose();MyException myException = null;try { autoClose.work();} catch (MyException e) { myException = e; throw e;} finally { if (myException != null) { try { autoClose.close(); } catch (Throwable t) { myException.addSuppressed(t); } } else { autoClose.close(); }}
    • AutoClose autoClose = new AutoClose();MyException myException = null;try { autoClose.work();} catch (MyException e) { myException = e; throw e;} finally { if (myException != null) { try { autoClose.close(); } catch (Throwable t) { myException.addSuppressed(t); } } else { autoClose.close(); }}
    • try (AutoClose autoClose = new AutoClose()) { autoClose.work();}
    • try (AutoClose autoClose = new AutoClose()) { autoClose.work(); }>>> work() >>> close() MyException: Exception in work()        at AutoClose.work(AutoClose.java:11)        at AutoClose.main(AutoClose.java:16)        Suppressed: java.lang.RuntimeException: Exception in close()               at AutoClose.close(AutoClose.java:6)               at AutoClose.main(AutoClose.java:17)
    • public void compress(String input, String output) throws IOException { try( FileInputStream fin = new FileInputStream(input); FileOutputStream fout = new FileOutputStream(output); GZIPOutputStream out = new GZIPOutputStream(fout) ) { byte[] buffer = new byte[4096]; int nread = 0; while ((nread = fin.read(buffer)) != -1) { out.write(buffer, 0, nread); } }}
    • public void compress(String input, String output) throws IOException { public void compress(String paramString1, String paramString2) try(         throws IOException { FileInputStream fin = new FileInputStream(input);     FileInputStream localFileInputStream = new FileInputStream(paramString1); FileOutputStream fout = new FileOutputStream(output);     Object localObject1 = null; GZIPOutputStream out = new GZIPOutputStream(fout)     try { ) {         FileOutputStream localFileOutputStream = new FileOutputStream(paramString2); byte[] buffer = new byte[4096];         Object localObject2 = null; int nread = 0;         try { while ((nread = fin.read(buffer)) != -1) {             GZIPOutputStream localGZIPOutputStream = new GZIPOutputStream(localFileOutputStream); out.write(buffer, 0, nread);             Object localObject3 = null; }             try { }                 byte[] arrayOfByte = new byte[4096];}                 int i = 0;                 while ((i = localFileInputStream.read(arrayOfByte)) != -1) {                     localGZIPOutputStream.write(arrayOfByte, 0, i);                 }             } catch (Throwable localThrowable6) {                 localObject3 = localThrowable6;                 throw localThrowable6;             } finally {                 if (localGZIPOutputStream != null) {                     if (localObject3 != null) {                         try {                             localGZIPOutputStream.close();                         } catch (Throwable localThrowable7) {                             localObject3.addSuppressed(localThrowable7);                         }                     } else {                         localGZIPOutputStream.close();                     }                 }             }         } catch (Throwable localThrowable4) {             localObject2 = localThrowable4;             throw localThrowable4;         } finally {             if (localFileOutputStream != null) {                 if (localObject2 != null) {                     try {                         localFileOutputStream.close();                     } catch (Throwable localThrowable8) {                         localObject2.addSuppressed(localThrowable8);                     }                 } else {                     localFileOutputStream.close();                 }             }         }     } catch (Throwable localThrowable2) {         localObject1 = localThrowable2;         throw localThrowable2;     } finally {         if (localFileInputStream != null) {             if (localObject1 != null) {                 try {                     localFileInputStream.close();                 } catch (Throwable localThrowable9) {                     localObject1.addSuppressed(localThrowable9);                 }             } else {                 localFileInputStream.close();             }         }     } }
    • Not just syntactic sugarClutter-free, correct codeclose(): - be more specific than java.lang.Exception - no exception if it can’t fail - no exception that shall not be suppressed (e.g., java.lang.InterruptedException)
    • Diamond <>
    • List<String> strings = new LinkedList<Integer>();Map<String, List<String>> contacts = new HashMap<Integer, String>();
    • List<String> strings = new LinkedList<String>();strings.add("hello");strings.add("world");Map<String, List<String>> contacts = new HashMap<String, List<String>>();contacts.put("Julien", new LinkedList<String>());contacts.get("Julien").addAll(asList("Foo", "Bar", "Baz"));
    • List<String> strings = new LinkedList<>();strings.add("hello");strings.add("world");Map<String, List<String>> contacts = new HashMap<>();contacts.put("Julien", new LinkedList<String>());contacts.get("Julien").addAll(asList("Foo", "Bar", "Baz"));
    • Map<String, String> map = new HashMap<String, String>() { { put("foo", "bar"); put("bar", "baz"); }};
    • Map<String, String> map = new HashMap<>() { { put("foo", "bar"); put("bar", "baz"); }};
    • Map<String, String> map = new HashMap<>() { { put("foo", "bar"); put("bar", "baz"); }};Diamond.java:43: error: cannot infer type arguments for HashMap; Map<String, String> map = new HashMap<>() { ^ reason: cannot use <> with anonymous inner classes1 error
    • class SomeClass<T extends Serializable & CharSequence> { } Non-denotable type
    • class SomeClass<T extends Serializable & CharSequence> { } Non-denotable typeSomeClass<?> foo = new SomeClass<String>();SomeClass<?> fooInner = new SomeClass<String>() { };SomeClass<?> bar = new SomeClass<>();SomeClass<?> bar = new SomeClass<>() { };
    • class SomeClass<T extends Serializable & CharSequence> { } Non-denotable typeSomeClass<?> foo = new SomeClass<String>();SomeClass<?> fooInner = new SomeClass<String>() { };SomeClass<?> bar = new SomeClass<>();SomeClass<?> bar = new SomeClass<>() { }; No denotable type to generate a class
    • Less ceremony when using genericsNo diamond with inner classes
    • Simplified varargs
    • private static <T> void doSomethingBad(List<T> list, T... values) { values[0] = list.get(0);}public static void main(String[] args) { List list = Arrays.asList("foo", "bar", "baz"); doSomethingBad(list, 1, 2, 3);}
    • This yields warnings + crash:private static <T> void doSomethingBad(List<T> list, T... values) { values[0] = list.get(0);}public static void main(String[] args) { List list = Arrays.asList("foo", "bar", "baz"); doSomethingBad(list, 1, 2, 3);} Heap Pollution: List = List<String>
    • private static <T> void doSomethingGood(List<T> list, T... values) { for (T value : values) { list.add(value); }}
    • private static <T> void doSomethingGood(List<T> list, T... values) { for (T value : values) { list.add(value); }}$ javac Good.javaNote: Good.java uses unchecked or unsafe operations.Note: Recompile with -Xlint:unchecked for details.
    • @SuppressWarnings({“unchecked”,“varargs”})public static void main(String[] args) { List<String> list = new LinkedList<>(); doSomethingGood(list, "hi", "there", "!");}$ javac Good.java$
    • static, final methods, constructors@SafeVarargsprivate static <T> void doSomethingGood(List<T> list, T... values) { for (T value : values) { list.add(value); }}
    • Mark your code as safe for varargsYou can’t cheat with @SafeVaragsRemove @SuppressWarnings in client codeand pay attention to real warnings
    • Multi-catch & more precise rethrow
    • Class<?> stringClass = Class.forName("java.lang.String");Object instance = stringClass.newInstance();Method toStringMethod = stringClass.getMethod("toString");System.out.println(toStringMethod.invoke(instance));
    • try { Class<?> stringClass = Class.forName("java.lang.String"); Object instance = stringClass.newInstance(); Method toStringMethod = stringClass.getMethod("toString"); System.out.println(toStringMethod.invoke(instance));} catch (ClassNotFoundException e) { e.printStackTrace();} catch (InstantiationException e) { e.printStackTrace();} catch (IllegalAccessException e) { e.printStackTrace();} catch (NoSuchMethodException e) { e.printStackTrace();} catch (InvocationTargetException e) { e.printStackTrace();}
    • try { Class<?> stringClass = Class.forName("java.lang.String"); Object instance = stringClass.newInstance(); Method toStringMethod = stringClass.getMethod("toString"); System.out.println(toStringMethod.invoke(instance));} catch (Throwable t) { t.printStackTrace();}
    • try { Class<?> stringClass = Class.forName("java.lang.String"); Object instance = stringClass.newInstance(); Method toStringMethod = stringClass.getMethod("toString"); System.out.println(toStringMethod.invoke(instance));} catch (Throwable t) { t.printStackTrace();} How about SecurityException?
    • try { Class<?> stringClass = Class.forName("java.lang.String"); Object instance = stringClass.newInstance(); Method toStringMethod = stringClass.getMethod("toString"); System.out.println(toStringMethod.invoke(instance));} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace();} Union of alternatives
    • catch (SomeException e)Now implicitly final unless assigned...
    • static class SomeRootException extends Exception { }static class SomeChildException extends SomeRootException { }static class SomeOtherChildException extends SomeRootException { }public static void main(String... args) throws Throwable {try { throw new SomeChildException();} catch (SomeRootException firstException) { try { throw firstException; } catch (SomeOtherChildException secondException) { System.out.println("I got you!"); }}
    • static class SomeRootException extends Exception { }static class SomeChildException extends SomeRootException { }static class SomeOtherChildException extends SomeRootException { }public static void main(String... args) throws Throwable {try { throw new SomeChildException();} catch (SomeRootException firstException) { try { throw firstException; } catch (SomeOtherChildException secondException) { System.out.println("I got you!"); }}$ javac Imprecise.javaImprecise.java:13: error: exception SomeOtherChildException is never thrown in body ofcorresponding try statement } catch (SomeOtherChildException secondException) { ^1 error
    • Less clutterBe preciseDo not capture unintended exceptionsBetter exception flow analysis
    • Minor additions
    • // 123 in decimal, octal, hexadecimal and binarybyte decimal = 123;byte octal = 0_173;byte hexadecimal = 0x7b;byte binary = 0b0111_1011;// Other valuesdouble doubleValue = 1.111_222_444F;long longValue = 1_234_567_898L;long longHexa = 0x1234_3b3b_0123_cdefL;
    • public static boolean isTrue(String str) { switch(str.trim().toUpperCase()) { case "OK": case "YES": case "TRUE": return true; case "KO": case "NO": case "FALSE": return false; default: throw new IllegalArgumentException("Not a valid true/false string."); }}
    • public static boolean isTrue(String s) { String str = s.trim().toUpperCase(); int jump = -1; switch(str.hashCode()) { case 2404: if (str.equals("KO")) { jump = 3; Bucket } break;(...) switch(jump) {(...) case 3: case 4: case 5: return false; default: Real code throw new IllegalArgumentException( "Not a valid true/false string."); }}
    • Oracle Technology Network (more soon...) Fork and Join: Java Can Excel at Painless Parallel Programming Too! http://goo.gl/tostz Better Resource Management with Java SE 7: Beyond Syntactic Sugar http://goo.gl/7ybgr
    • Julien Ponge @jponge http://gplus.to/jpongehttp://julien.ponge.info/julien.ponge@insa-lyon.fr