- 大家好!欢迎莅临厚土燎原的天地,深感荣幸能与您相遇在此,共同品读我的拙作。您的阅读如同春风化雨,对我而言意义非凡。衷心邀请您留下宝贵的评论与指点,每一字一句都是对我莫大的鼓励与鞭策。热烈欢迎,期待与您智慧碰撞,共绘思想的火花!
- 🌿🌿🌿 个人主页:厚土燎原
目录
创建线程有四种方式
1、继承Thread类
2、实现Runnable接口
3、Callable和FutureTask
4、线程池
1、继承Thread类
public class MyThread extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("主线程在运行!");
}
结果
主线程在运行!
Thread-0在运行!
2、实现Runnable接口
public class MyThread implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
System.out.println("主线程在运行!");
}
结果
主线程在运行!
Thread-0在运行!
3、Callable和FutureTask
public class MyThread implements Callable<String> {
@Override
public String call() {
System.out.println(Thread.currentThread().getName() + "在运行!");
return "call执行";
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
FutureTask<String> task = new FutureTask<>(myThread);
Thread thread = new Thread(task);
thread.start();
System.out.println("主线程在运行!");
try {
String result = task.get();
System.out.println("子线程返回的结果是:" + result);
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
结果
主线程在运行!
Thread-0在运行!
子线程返回的结果是:call执行
4、线程池
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(1);
Runnable task = () -> System.out.println(Thread.currentThread().getName() + "在运行!");
threadPool.submit(task);
System.out.println("主线程在运行!");
threadPool.shutdown();
}
可用性排序
线程池 > Callable和FutureTask > 实现Runnable接口 > 继承Thread类
1、java是单继承的、如果继承Thread则无法继承其他的类,所以实现runnable接口要优于继承Thread的方式。
2、FutureTask本质上和实现Runnable接口一样,但是FutureTask可以通过get方法获取到返回值,所以要优于直接实现Runnable接口的。
3、线程池是最优的。
3.1、其他几种方式创建的线程数量不可控,极易造成线程大量存在,从而引起内存溢出,导致系统崩溃。
3.2、其他几种方式频繁的创建、销毁线程、非常浪费资源。