第一種、自定義類繼承Thread,重寫run()方法
public class Test {
public static void main(String[] args) {
new Demo().start();
}
}
class Demo extends Thread {
@Override
public void run() {
System.out.println("第一種創建方式");
}
}
第二種、自定義類實現Runnable接口
public class Test {
public static void main(String[] args) {
Demo demo = new Demo();
new Thread(demo).start();
}
}
class Demo implements Runnable {
@Override
public void run() {
System.out.println("第二種創建方式");
}
}
第三種、自定義類實現Callable接口
public class Test {
public static void main(String[] args) {
Demo demo = new Demo();
// 引用FutureTask支持
FutureTask<String> ft = new FutureTask(demo);
new Thread(ft).start();
try {
// 獲取線程結果,注意:當FutureTask沒有執行完的時候,是無法獲取結果的,效果類似閉鎖。
System.out.println(ft.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Demo implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("第三種創建方式");
return "第三種創建方式";
}
}
第四種、線程池
線程池:提供了一個線程隊列,隊列中保存着所有等待狀態的線程,避免了線程的創建與銷燬的額外開銷,提高了響應速度。
相關工具方法:
- Executors.newCachedThreadPool():無界線程池,可以進行自動線程回收
- Executors.newFixedThreadPool(int):固定大小線程池
- Executors.newSingleThreadExecutor():單個後臺線程
舉例:
1、Runnable 接口
public class HelloWorld {
public static void main(String[] args) {
// 創建數量爲5的線程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// 任務提交給線程池
for (int i = 0; i < 10; i++) {
threadPool.submit(new TestThreadPool());
}
// 關閉線程池
threadPool.shutdown();
}
}
class TestThreadPool implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " : " + i);
}
}
}
2、Callable 接口
public class HelloWorld {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 創建數量爲5的線程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// 任務提交給線程池
ArrayList<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Future<Integer> future = threadPool.submit(() -> {
int sum = 0;
for (int j = 0; j < 10; j++) {
sum += j;
}
return sum;
});
futures.add(future);
}
// 關閉線程池
threadPool.shutdown();
for (Future<Integer> future : futures) {
System.out.println(future.get());
}
}
}
- new ScheduledThreadPoolExecutor():創建固定大小的線程池,可以延時或者執行定時任務。
舉例:
public class HelloWorld {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 創建數量爲5的線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(5);
List<ScheduledFuture<Integer>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ScheduledFuture<Integer> future = threadPool.schedule(() -> {
int anInt = new Random().nextInt(100);
System.out.println(Thread.currentThread().getName() + " : " + anInt);
return anInt;
}, 3, TimeUnit.SECONDS); // 延遲3秒執行任務
list.add(future);
}
threadPool.shutdown();
for (ScheduledFuture<Integer> future : list) {
System.out.println(future.get());
}
}
}