创建线程的四种方式
一、继承Thread类型
步骤:
- 定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法
- 创建自定义的线程子类对象
- 调用子类实例的star()方法来启动线程
public class Test5 { public static void main(String[] args) { MyThread t1=new MyThread(); t1.start(); System.out.println(Thread.currentThread().getName()+"执行完成。"); } } class MyThread extends Thread{ @Override public void run(){ System.out.println(Thread.currentThread().getName()+"执行中。。。"); } }
二、实现Runnable接口
步骤
- 定义Runnable接口实现类MyRunnable,并重写run()方法
- 创建MyRunnable实例myRunnable,以myRunnable作为target创建Thead对象,该Thread对象才是真正的线程对象
- 调用线程对象的start()方法
/** * @description: Runnable接口有@FunctionalInterface,可以通过lamada创建 * @author: mufeng * @create: 2020/5/13 17:20 */ public class Test6 { public static void main(String[] args) { Thread t1=new Thread(()->{ System.out.println(Thread.currentThread().getName()+"执行中"); }); t1.start(); System.out.println(Thread.currentThread().getName()+"执行完成。"); } }
三、使用Callable和Future创建线程
步骤
- 创建实现Callable接口的类myCallable
- 以myCallable为参数创建FutureTask对象
- 将FutureTask作为参数创建Thread对象
- 调用线程对象的start()方法
/** * @description: Callable接口有@FunctionalInterface,可以通过lamada创建 * @author: mufeng * @create: 2020/5/13 17:25 */ public class Test7 { public static void main(String[] args) { FutureTask<Integer> futureTask=new FutureTask(()->{ System.out.println(Thread.currentThread().getName()+"执行中"); return 1; }); Thread t1=new Thread(futureTask); t1.start(); try { System.out.println(Thread.currentThread().getName()+"结束:"+futureTask.get()); } catch (Exception e) { e.printStackTrace(); } } }
四、使用Executor框架创建线程池
Executors提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
主要有newFixedThreadPool,newCachedThreadPool,newSingleThreadExecutor,newScheduledThreadPool
public class Test8 { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); for(int i=0;i<5;i++){ executorService.execute(()->{ System.out.println(Thread.currentThread().getName()+"执行中"); }); } System.out.println("线程任务开始执行"); executorService.shutdown(); } }