创建线程的四种方式
本质上都是实现 Runnable 接口
1、继承 Thread 类
public class TestThread extends Thread{
public static void main(String[] args) {
TestThread tt = new TestThread();
tt.start();
}
@Override
public void run() {
super.run();
System.out.println("New Thread");
}
}
缺点:继承 Thread 后,无法继承其它类
2、实现 Runnable 接口
public class TestThread2 implements Runnable{
public static void main(String[] args) {
Thread thread = new Thread(new TestThread2());
thread.start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("匿名内部类");
}
}).start();
//函数式接口->一个接口中只有一个方法,可以转换为lambda表达式(java8新特性)
new Thread(()-> System.out.println("lambda表达式")).start();
}
@Override
public void run() {
System.out.println("new thread");
}
}
接口可以多继承
3、实现 Callable 接口
public class TestThread3 implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> ft = new FutureTask<>(new TestThread3());
Thread thread = new Thread(ft);
thread.start();
//阻塞式的获取线程执行结果
System.out.println(ft.get());
}
public String call(){
return "你好";
}
}
4、线程池
public class TestThread4 implements Runnable{
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new TestThread4());
}
@Override
public void run() {
System.out.println("你好 世界");
}
}
不建议使用 Executors 创建线程池
底层是无界阻塞队列有可能造成 OOM 之外,我们使用 Executors 来创建线程池也不能自定义线程的名字,不利于排查问题,所以建议直接使用 ThreadPoolExecutor 来定义线程池,这样可以灵活控制。****
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于