1.繼承Thread類
public class ThreadDemo1 extends Thread {
public ThreadDemo1() {
}
@Override
public void run() {
System.out.println("繼承Thread類實現多線程");
}
public static void main(String[] args) {
// 子類 start.
ThreadDemo1 threadDemo1 = new ThreadDemo1();
threadDemo1.start();
// Thread 類 start.
Thread thread = new Thread(threadDemo1);
thread.start();
}
}
輸出結果
2.實現Runnable接口
public class MyThread implements Runnable {
@Override
public void run() {
System.out.println("實現Runnable接口實現多線程");
}
public static void main(String[] args) {
Thread thread = new Thread(new MyThread());
thread.start();
}
}
3.通過Callable和FutureTask創建線程
public class ThreadDemo2 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("通過Callable和FutureTask創建線程 ");
return "通過FutureTask對象的get";
}
public static void main(String[] args) throws Exception {
Callable<String> callable = new ThreadDemo2();
FutureTask<String> task = new FutureTask<>(callable);
Thread thread = new Thread(task);
thread.start();
Thread.sleep(10);
// 通過FutureTask對象的get()方法得到返回值
System.out.println(task.get());
}
}
4.通過原生線程池創建線程
@Slf4j
public class ThreadPoolExample1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
executorService.execute(() -> log.info("task:{}", Thread.currentThread().getName()));
}
executorService.shutdown();
}
}
5.Spring 自帶線程池
public class ThreadDemo3 {
public static void main(String[] args) throws Exception {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(8);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(200);
executor.setKeepAliveSeconds(60);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.setAllowCoreThreadTimeOut(true);
executor.setThreadNamePrefix("spring thread pool");
executor.initialize();
// 1. 通過 execute 方法 ,傳入一個Runnable對象
executor.execute(() -> {
System.out.println("不帶返回值");
});
// 2.通過submit 方法,傳入一個Callable 對象
Future callFuture = executor.submit(new Callable<Object>() {
@Override
public Object call() {
System.out.println("通過submit 方法,傳入一個Callable 對象");
return "返回結果 - 通過submit 方法,傳入一個Callable 對象";
}
});
System.out.println(callFuture.get());
Future<String> callFutureLambda = executor.submit(() -> {
System.out.println("通過submit 方法,傳入一個Callable 對象");
return "hello";
});
// 3. 通過 submit 方法,傳入一個Runnable 對象
Future runnableFuture = executor.submit(new Runnable() {
@Override
public void run() {
System.out.println("通過 submit 方法,傳入一個Runnable 對象");
}
});
System.out.println(runnableFuture.get());
Future runnableFutureLambda = executor.submit(() -> System.out.println("通過 submit 方法,傳入一個Runnable 對象"));
}
}