线程
1、继承Thread
public static void main(String[] args){
System.out.println("main...start....");
Thread01 thread=new Thread01();
thread.start();
System.out.println("main...end....");
}
public static class Thread01 extends Thread {
@Override
public void run() {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
}
}
2、实现Runable接口
public static void main(String[] args){
System.out.println("main...start....");
Runable01 runable01 =new Runable01();
new Thread(runable01).start();
System.out.println("main...end....");
}
public static class Runable01 implements Runnable {
@Override
public void run() {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
}
}
3、实现Callable接口
public static void main(String[] args){
System.out.println("main...start....");
FutureTask<Integer> futureTask = new FutureTask<>(new Callable01());
new Thread(futureTask).start();
Integer integer = futureTask.get();
System.out.println("main...end...."+integer);
}
public static class Callable01 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}
}
4、线程池
4.1、简介
public static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
System.out.println("main...start....");
executor.execute(new Runable01());
System.out.println("main...end....");
}
public static class Runable01 implements Runnable {
@Override
public void run() {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
}
}
4.2、创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5,
200,
10,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(100000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
异步
1、runAsync
public static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main...start....");
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
}, executor);
System.out.println("main...end....");
}
2、supplyAsync
2.1、whenComplete(完成回调),exceptionally(异常感知)
public static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args){
System.out.println("main...start....");
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}, executor).whenComplete((res, exception) -> {
System.out.println("异步任务成功完成了...结果是:" + res + "异常是:" + exception);
}).exceptionally(throwable -> {
return 10;
});
Integer integer=future.get();
System.out.println("main...end...."+integer);
}
2.2、handle(最终处理)
public static void main(String[] args){
System.out.println("main...start....");
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 4;
System.out.println("运行结果:" + i);
return i;
}, executor).handle((res, thr) -> {
if (res != null) {
return res * 2;
}
if (thr != null) {
return 0;
}
return 0;
});
Integer integer=future.get();
System.out.println("main...end...."+integer);
}
2.3、线程串行化
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 4;
System.out.println("运行结果:" + i);
return i;
}, executor).thenApplyAsync(res -> {
System.out.println("任务2启动了..." + res);
return "Hello" + res;
}, executor);
System.out.println("main...end...."+future.get());
2.4、两任务组合——都完成
CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务1线程:" + Thread.currentThread().getId());
int i = 10 / 4;
System.out.println("任务1结束:" + i);
return i;
}, executor);
CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务2线程:" + Thread.currentThread().getId());
System.out.println("任务2结束:");
return "Hello";
}, executor);
future01.runAfterBothAsync(future02,()->{
System.out.println("任务3开始...");
},executor);
future01.thenAcceptBothAsync(future02, (f1, f2) -> {
System.out.println("任务3开始...之前的结果:" + f1 + "--->" + f2);
}, executor);
CompletableFuture<String> future = future01.thenCombineAsync(future02, (f1, f2) -> {
return f1 + ":" + f2 + "-> Haha";
}, executor);
2.5、两任务组合——一个完成
CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务1线程:" + Thread.currentThread().getId());
int i = 10 / 4;
System.out.println("任务1结束:" + i);
return i;
}, executor);
CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务2线程:" + Thread.currentThread().getId());
System.out.println("任务2结束:");
return "Hello";
}, executor);
future01.runAfterEitherAsync(future02, () -> {
System.out.println("任务3开始...之前的结果:");
}, executor);
future01.acceptEitherAsync(future02,(res)->{
System.out.println("任务3开始...之前的结果:"+res);
},executor);
CompletableFuture<String> future = future01.applyToEitherAsync(future02, (res) -> {
System.out.println("任务3开始...之前的结果:" + res);
return res.toString() + "->哈哈";
}, executor);
2.6、多任务组合
CompletableFuture<String> future1= CompletableFuture.supplyAsync(() -> {
System.out.println("任务1");
return "任务1结果";
},executor);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务2");
return "任务2结果";
},executor);
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
System.out.println("任务3");
return "任务3结果";
},executor);
CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2 , future3 );
allOf.get();
CompletableFuture<Object> anyOf = CompletableFuture.anyOf(uture1, future2 , future3);
anyOf.get();
System.out.println("main...end..."+anyOf.get())