SlideShare a Scribd company logo
1 of 77
Download to read offline
cocktail d’expérience informatiques
             Genève 3 & 4 octobre 2011
                    Seconde édition
                      soft-shake.ch




Auteur    Julien PONGE
  Track   Java
Session   Java SE 7
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 variables
5, 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 easy
1.1
1.2
1.3
1.4


 5    Concurrency made easier
 6



 7    Parallelism made easier
Sum of an array


n1   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 work

Thread management      Split
Maximize parallelism   Fork subtasks
      Work stealing    Join subtasks
                       Compose results
ForkJoinTask




       join()                   join()
                                              RecursiveAction
                fork()    fork()
                                                     vs
                                               RecursiveTask

Child ForkJoinTask       Child ForkJoinTask
16


                          Folder word
                         counting task


 10
                                                         5
                                1


Document 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/O
No synchronization / locks

Decompose in simple recursive tasks
Do not decompose below a threshold

Take advantage of multicores with no pain

You have more F/J candidate algorithms than
you 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 sugar
Clutter-free, correct code

close():
   - 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 classes
1 error
class SomeClass<T extends Serializable & CharSequence> { }




                                     Non-denotable type
class SomeClass<T extends Serializable & CharSequence> { }




                                        Non-denotable type

SomeClass<?> 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 type

SomeClass<?> 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 generics

No 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.java
Note: 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



@SafeVarargs
private static <T> void doSomethingGood(List<T> list, T... values) {
    for (T value : values) {
        list.add(value);
    }
}
Mark your code as safe for varargs

You can’t cheat with @SafeVarags

Remove @SuppressWarnings in client code
and 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.java
Imprecise.java:13: error: exception SomeOtherChildException is never thrown in body of
corresponding try statement
            } catch (SomeOtherChildException secondException) {
              ^
1 error
Less clutter
Be precise
Do not capture unintended exceptions

Better exception flow analysis
Minor additions
// 123 in decimal, octal, hexadecimal and binary
byte decimal = 123;
byte octal = 0_173;
byte hexadecimal = 0x7b;
byte binary = 0b0111_1011;

// Other values
double 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/jponge

http://julien.ponge.info/

julien.ponge@insa-lyon.fr

More Related Content

What's hot

.NET Multithreading and File I/O
.NET Multithreading and File I/O.NET Multithreading and File I/O
.NET Multithreading and File I/O
Jussi Pohjolainen
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
Soumya Behera
 

What's hot (20)

5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113
 
Sam wd programs
Sam wd programsSam wd programs
Sam wd programs
 
Apache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheelApache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheel
 
.NET Multithreading and File I/O
.NET Multithreading and File I/O.NET Multithreading and File I/O
.NET Multithreading and File I/O
 
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVEEasy Going Groovy 2nd season on DevLOVE
Easy Going Groovy 2nd season on DevLOVE
 
Riga Dev Day 2016 - Having fun with Javassist
Riga Dev Day 2016 - Having fun with JavassistRiga Dev Day 2016 - Having fun with Javassist
Riga Dev Day 2016 - Having fun with Javassist
 
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
 
Dagger & rxjava & retrofit
Dagger & rxjava & retrofitDagger & rxjava & retrofit
Dagger & rxjava & retrofit
 
Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 
Groovy 1.8の新機能について
Groovy 1.8の新機能についてGroovy 1.8の新機能について
Groovy 1.8の新機能について
 
Migrating to JUnit 5
Migrating to JUnit 5Migrating to JUnit 5
Migrating to JUnit 5
 
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
 
Java Concurrency Idioms
Java Concurrency IdiomsJava Concurrency Idioms
Java Concurrency Idioms
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
 
Effective java - concurrency
Effective java - concurrencyEffective java - concurrency
Effective java - concurrency
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
Metaprogramming and Reflection in Common Lisp
Metaprogramming and Reflection in Common LispMetaprogramming and Reflection in Common Lisp
Metaprogramming and Reflection in Common Lisp
 
Python Async IO Horizon
Python Async IO HorizonPython Async IO Horizon
Python Async IO Horizon
 

Viewers also liked

Viewers also liked (6)

Cleaner and Leaner Groovy
Cleaner and Leaner GroovyCleaner and Leaner Groovy
Cleaner and Leaner Groovy
 
Entrepreneurship and Commerce in IT - 14 - Web Marketing Communications
Entrepreneurship and Commerce in IT - 14 - Web Marketing CommunicationsEntrepreneurship and Commerce in IT - 14 - Web Marketing Communications
Entrepreneurship and Commerce in IT - 14 - Web Marketing Communications
 
Fork Join
Fork JoinFork Join
Fork Join
 
Concurrency Programming in Java - 07 - High-level Concurrency objects, Lock O...
Concurrency Programming in Java - 07 - High-level Concurrency objects, Lock O...Concurrency Programming in Java - 07 - High-level Concurrency objects, Lock O...
Concurrency Programming in Java - 07 - High-level Concurrency objects, Lock O...
 
Fork and join framework
Fork and join frameworkFork and join framework
Fork and join framework
 
Concurrency Programming in Java - 01 - Introduction to Concurrency Programming
Concurrency Programming in Java - 01 - Introduction to Concurrency ProgrammingConcurrency Programming in Java - 01 - Introduction to Concurrency Programming
Concurrency Programming in Java - 01 - Introduction to Concurrency Programming
 

Similar to soft-shake.ch - Java SE 7: The Fork/Join Framework and Project Coin

エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理
maruyama097
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
Jan Kronquist
 
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
Tomek Kaczanowski
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
HamletDRC
 
Java Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdfJava Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdf
adinathassociates
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
 

Similar to soft-shake.ch - Java SE 7: The Fork/Join Framework and Project Coin (20)

JAVA SE 7
JAVA SE 7JAVA SE 7
JAVA SE 7
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理エンタープライズ・クラウドと 並列・分散・非同期処理
エンタープライズ・クラウドと 並列・分散・非同期処理
 
Closures for Java
Closures for JavaClosures for Java
Closures for Java
 
Java 7
Java 7Java 7
Java 7
 
Java 104
Java 104Java 104
Java 104
 
2012 JDays Bad Tests Good Tests
2012 JDays Bad Tests Good Tests2012 JDays Bad Tests Good Tests
2012 JDays Bad Tests Good Tests
 
Multithreading in Java
Multithreading in JavaMultithreading in Java
Multithreading in Java
 
Voxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistVoxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with Javassist
 
A topology of memory leaks on the JVM
A topology of memory leaks on the JVMA topology of memory leaks on the JVM
A topology of memory leaks on the JVM
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
 
Inheritance
InheritanceInheritance
Inheritance
 
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
 
Exceptions and errors in Java
Exceptions and errors in JavaExceptions and errors in Java
Exceptions and errors in Java
 
Coding using jscript test complete
Coding using jscript test completeCoding using jscript test complete
Coding using jscript test complete
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Testing with Node.js
Testing with Node.jsTesting with Node.js
Testing with Node.js
 
Java Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdfJava Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdf
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 

More from soft-shake.ch

soft-shake.ch - Déploiement continu sur le cloud avec SlipStream
soft-shake.ch - Déploiement continu sur le cloud avec SlipStreamsoft-shake.ch - Déploiement continu sur le cloud avec SlipStream
soft-shake.ch - Déploiement continu sur le cloud avec SlipStream
soft-shake.ch
 
soft-shake.ch - An introduction to social architecture
soft-shake.ch - An introduction to social architecturesoft-shake.ch - An introduction to social architecture
soft-shake.ch - An introduction to social architecture
soft-shake.ch
 

More from soft-shake.ch (20)

soft-shake.ch - Windows Phone 7 „Mango“ – what’s new for Developers?
soft-shake.ch - Windows Phone 7 „Mango“ – what’s new for Developers?soft-shake.ch - Windows Phone 7 „Mango“ – what’s new for Developers?
soft-shake.ch - Windows Phone 7 „Mango“ – what’s new for Developers?
 
soft-shake.ch - Introduction to HTML5
soft-shake.ch - Introduction to HTML5soft-shake.ch - Introduction to HTML5
soft-shake.ch - Introduction to HTML5
 
soft-shake.ch - WebMatrix: Your Web Made Easy
soft-shake.ch - WebMatrix: Your Web Made Easysoft-shake.ch - WebMatrix: Your Web Made Easy
soft-shake.ch - WebMatrix: Your Web Made Easy
 
soft-shake.ch - Domotique et robotique avec le micro Framework .NET
soft-shake.ch - Domotique et robotique avec le micro Framework .NETsoft-shake.ch - Domotique et robotique avec le micro Framework .NET
soft-shake.ch - Domotique et robotique avec le micro Framework .NET
 
soft-shake.ch - Clojure Values
soft-shake.ch - Clojure Valuessoft-shake.ch - Clojure Values
soft-shake.ch - Clojure Values
 
soft-shake.ch - Data grids and Data Grids
soft-shake.ch - Data grids and Data Gridssoft-shake.ch - Data grids and Data Grids
soft-shake.ch - Data grids and Data Grids
 
soft-shake.ch - Data grids and Data Caching
soft-shake.ch - Data grids and Data Cachingsoft-shake.ch - Data grids and Data Caching
soft-shake.ch - Data grids and Data Caching
 
soft-shake.ch - JBoss AS 7, la révolution
soft-shake.ch - JBoss AS 7, la révolutionsoft-shake.ch - JBoss AS 7, la révolution
soft-shake.ch - JBoss AS 7, la révolution
 
soft-shake.ch - Tests d'intégration JavaEE avec Arquillian
soft-shake.ch - Tests d'intégration JavaEE avec Arquilliansoft-shake.ch - Tests d'intégration JavaEE avec Arquillian
soft-shake.ch - Tests d'intégration JavaEE avec Arquillian
 
soft-shake.ch - Un zeste d’Erlang dans le shaker!
soft-shake.ch - Un zeste d’Erlang dans le shaker!soft-shake.ch - Un zeste d’Erlang dans le shaker!
soft-shake.ch - Un zeste d’Erlang dans le shaker!
 
soft-shake.ch - Déploiement continu sur le cloud avec SlipStream
soft-shake.ch - Déploiement continu sur le cloud avec SlipStreamsoft-shake.ch - Déploiement continu sur le cloud avec SlipStream
soft-shake.ch - Déploiement continu sur le cloud avec SlipStream
 
soft-shake.ch - An introduction to social architecture
soft-shake.ch - An introduction to social architecturesoft-shake.ch - An introduction to social architecture
soft-shake.ch - An introduction to social architecture
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
soft-shake.ch - De Hermes RUP à Hermes Scrum
soft-shake.ch - De Hermes RUP à Hermes Scrumsoft-shake.ch - De Hermes RUP à Hermes Scrum
soft-shake.ch - De Hermes RUP à Hermes Scrum
 
soft-shake.ch - Stewardship et motivation
soft-shake.ch - Stewardship et motivationsoft-shake.ch - Stewardship et motivation
soft-shake.ch - Stewardship et motivation
 
soft-shake.ch - Agile qu'es aco : scrum xp lean
soft-shake.ch - Agile qu'es aco : scrum xp leansoft-shake.ch - Agile qu'es aco : scrum xp lean
soft-shake.ch - Agile qu'es aco : scrum xp lean
 
soft-shake.ch - Documentation et agilité
soft-shake.ch - Documentation et agilitésoft-shake.ch - Documentation et agilité
soft-shake.ch - Documentation et agilité
 
soft-shake.ch - Agilité = discipline et rigueur ?
soft-shake.ch - Agilité = discipline et rigueur ?soft-shake.ch - Agilité = discipline et rigueur ?
soft-shake.ch - Agilité = discipline et rigueur ?
 
soft-shake.ch - Transition agile & Accompagnement au changement
soft-shake.ch - Transition agile & Accompagnement au changementsoft-shake.ch - Transition agile & Accompagnement au changement
soft-shake.ch - Transition agile & Accompagnement au changement
 
soft-shake.ch - Agilité et Testing: de l'intérêt d'une démarche structurée
soft-shake.ch - Agilité et Testing: de l'intérêt d'une démarche structuréesoft-shake.ch - Agilité et Testing: de l'intérêt d'une démarche structurée
soft-shake.ch - Agilité et Testing: de l'intérêt d'une démarche structurée
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 

soft-shake.ch - Java SE 7: The Fork/Join Framework and Project Coin

  • 1. cocktail d’expérience informatiques Genève 3 & 4 octobre 2011 Seconde édition soft-shake.ch Auteur Julien PONGE Track Java Session Java SE 7
  • 2.
  • 3. Java SE 7 Julien Ponge
  • 4.
  • 5. Fork / Join Project Coin NIO.2 invokedynamic (...)
  • 7. java.lang.Thread java.lang.Runnable wait() <5 notify() synchronized
  • 8. Thread thread = new Thread() { public void run() { System.out.println(">>> Hello!"); } }; thread.start(); thread.join();
  • 9. java.util.concurrent executors concurrent queues concurrent collections atomic variables 5, 6 synchronization patterns rich locks
  • 10. 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; } }
  • 11. 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()); }
  • 12. 1.0 Threads made easy 1.1 1.2 1.3 1.4 5 Concurrency made easier 6 7 Parallelism made easier
  • 13. Sum of an array n1 n2 n3 n4 n5 n6 n7 n8 n9 ... ... ... ... sum1 sum2 sum3 sum1 + sum2 sum3 + (...) total sum
  • 14. How many occurrences of “java.util.List” in this filesystem tree?
  • 15. Load into RAM (1 thread) Folder Document subfolders: List<Folder> lines: List<String> documents: List<Document> Divide & conquer (#cores threads)
  • 16. ForkJoinPool Your work Thread management Split Maximize parallelism Fork subtasks Work stealing Join subtasks Compose results
  • 17. ForkJoinTask join() join() RecursiveAction fork() fork() vs RecursiveTask Child ForkJoinTask Child ForkJoinTask
  • 18. 16 Folder word counting task 10 5 1 Document word Document word Folder word counting task counting task counting task 3 2 fork() Document word Document word n join() counting task counting task
  • 20. Speedup& 7" 6" 5" 4" 3" 2" 1" 2" 4" 6" 8" 10" 12" #cores
  • 21. No I/O No synchronization / locks Decompose in simple recursive tasks Do not decompose below a threshold Take advantage of multicores with no pain You have more F/J candidate algorithms than you think!
  • 23. private void writeSomeData() throws IOException { DataOutputStream out = new DataOutputStream(new FileOutputStream("data")); out.writeInt(666); out.writeUTF("Hello"); out.close(); }
  • 24. private void writeSomeData() throws IOException { DataOutputStream out = new DataOutputStream(new FileOutputStream("data")); out.writeInt(666); out.writeUTF("Hello"); out.close(); } what if...
  • 25. 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(); } } }
  • 26. 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!
  • 27. 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()); }
  • 28. 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()"); } }
  • 29. AutoClose autoClose = new AutoClose(); try { autoClose.work(); } finally { autoClose.close(); }
  • 30. 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)
  • 31. 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)
  • 32. “Caused by” ≠ “Also happened”
  • 33. 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(); } }
  • 34. 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(); } }
  • 35. 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(); } }
  • 36. 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(); } }
  • 37. 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(); } }
  • 38. try (AutoClose autoClose = new AutoClose()) { autoClose.work(); }
  • 39. 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)
  • 40. 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); } } }
  • 41. 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();             }         }     } }
  • 42. Not just syntactic sugar Clutter-free, correct code close(): - 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)
  • 44. List<String> strings = new LinkedList<Integer>(); Map<String, List<String>> contacts = new HashMap<Integer, String>();
  • 45. 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"));
  • 46. 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"));
  • 47. Map<String, String> map = new HashMap<String, String>() { { put("foo", "bar"); put("bar", "baz"); } };
  • 48. Map<String, String> map = new HashMap<>() { { put("foo", "bar"); put("bar", "baz"); } };
  • 49. 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 classes 1 error
  • 50. class SomeClass<T extends Serializable & CharSequence> { } Non-denotable type
  • 51. class SomeClass<T extends Serializable & CharSequence> { } Non-denotable type SomeClass<?> foo = new SomeClass<String>(); SomeClass<?> fooInner = new SomeClass<String>() { }; SomeClass<?> bar = new SomeClass<>(); SomeClass<?> bar = new SomeClass<>() { };
  • 52. class SomeClass<T extends Serializable & CharSequence> { } Non-denotable type SomeClass<?> foo = new SomeClass<String>(); SomeClass<?> fooInner = new SomeClass<String>() { }; SomeClass<?> bar = new SomeClass<>(); SomeClass<?> bar = new SomeClass<>() { }; No denotable type to generate a class
  • 53. Less ceremony when using generics No diamond with inner classes
  • 55. 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); }
  • 56. 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>
  • 57. private static <T> void doSomethingGood(List<T> list, T... values) { for (T value : values) { list.add(value); } }
  • 58. private static <T> void doSomethingGood(List<T> list, T... values) { for (T value : values) { list.add(value); } } $ javac Good.java Note: Good.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
  • 59. @SuppressWarnings({“unchecked”,“varargs”}) public static void main(String[] args) { List<String> list = new LinkedList<>(); doSomethingGood(list, "hi", "there", "!"); } $ javac Good.java $
  • 60. static, final methods, constructors @SafeVarargs private static <T> void doSomethingGood(List<T> list, T... values) { for (T value : values) { list.add(value); } }
  • 61. Mark your code as safe for varargs You can’t cheat with @SafeVarags Remove @SuppressWarnings in client code and pay attention to real warnings
  • 62. Multi-catch & more precise rethrow
  • 63. Class<?> stringClass = Class.forName("java.lang.String"); Object instance = stringClass.newInstance(); Method toStringMethod = stringClass.getMethod("toString"); System.out.println(toStringMethod.invoke(instance));
  • 64. 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(); }
  • 65. 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(); }
  • 66. 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?
  • 67. 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
  • 68. catch (SomeException e) Now implicitly final unless assigned...
  • 69. 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!"); } }
  • 70. 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.java Imprecise.java:13: error: exception SomeOtherChildException is never thrown in body of corresponding try statement } catch (SomeOtherChildException secondException) { ^ 1 error
  • 71. Less clutter Be precise Do not capture unintended exceptions Better exception flow analysis
  • 73. // 123 in decimal, octal, hexadecimal and binary byte decimal = 123; byte octal = 0_173; byte hexadecimal = 0x7b; byte binary = 0b0111_1011; // Other values double doubleValue = 1.111_222_444F; long longValue = 1_234_567_898L; long longHexa = 0x1234_3b3b_0123_cdefL;
  • 74. 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."); } }
  • 75. 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."); } }
  • 76. 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
  • 77. Julien Ponge @jponge http://gplus.to/jponge http://julien.ponge.info/ julien.ponge@insa-lyon.fr