创建线程的四种方式
本质上都是实现 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 来定义线程池,这样可以灵活控制。****
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于