package Mythread;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
class mythread1 extends Thread {
private int i;
public void run() {
for (; i<100;i++){
System.out.println(getName() + " "+i);
}
}
}
class mythread2 implements Runnable {
private int i;
public void run() {
for (; i<100;i++){
System.out.println(Thread.currentThread().getName() + " "+i);
}
}
}
class mythread3 implements Callable {
int i;
public Integer call() throws Exception {
for (; i<100;i++){
System.out.println(Thread.currentThread().getName() + " "+i);
}
return i;
}
}
public class mythread {
public static void main(String[] args) {
// TODO Auto-generated method stub
//demo for ways3: callable and FutureTask
//demo way4 for callable with anoymous inner class
//demo way5 for callable with lambda expression feature in Java8
FutureTask task3 = new FutureTask((Callable)()->{
int i=0;
for(i=0; i<100;i++) {
System.out.println(Thread.currentThread().getName() + " "+i);
}
return i;
}
);
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName() + " "+i);
if(i==20) {
new Thread(task3,"lambda thread5 with value").start();// it's a Runnable
}
}
try {
System.out.println("lambda thread5 return value "+task3.get());
} catch(Exception e) {
e.printStackTrace();
}
}
}