创建线程

1. 方式一

  1. import org.apache.log4j.Logger;
  2. /**
  3. * @ClassName CreateThreadOne
  4. * @Description 创建线程的方式一
  5. * 继承Thread类创建线程类
  6. * @Author wenqing_liu
  7. * @Date 2021/5/12 22:33
  8. */
  9. public class CreateThreadOne extends Thread{
  10. private final Logger logger = Logger.getLogger(this.getClass());
  11. @Override
  12. public void run() {
  13. logger.info("Thread Child !");
  14. }
  15. }

2. 方式二

  1. import org.apache.log4j.Logger;
  2. /**
  3. * @ClassName CreateThreadTwo
  4. * @Description 创建线程的方式二
  5. * 实现Runnable接口的run方法
  6. * @Author wenqing_liu
  7. * @Date 2021/5/13 22:40
  8. */
  9. public class CreateThreadTwo implements Runnable{
  10. private final Logger logger = Logger.getLogger(this.getClass());
  11. @Override
  12. public void run() {
  13. logger.info("Thread Child");
  14. }
  15. }

3. 方式三

  1. package com.wen.thread;
  2. import java.util.concurrent.Callable;
  3. /**
  4. * @ClassName CreateThreadThree
  5. * @Description 创建线程的第三种方式
  6. * 使用FutureTask的方式
  7. * @Author wenqing_liu
  8. * @Date 2021/5/16 22:55
  9. */
  10. public class CreateThreadThree implements Callable<String> {
  11. @Override
  12. public String call() {
  13. return "This is Child Thread!";
  14. }
  15. }

4. 三种方式的对比

  • 使用继承方式的好处是方便传参,你可以在子类里面添加成员变量,通过set方法设置参数或者通过构造函数进行传递,
  • 而如果使用Runnable方式,则只能使用主线程里面被声明为final的变量。不好的地方是Java不支持多继承,如果继承了Thread类,那么子类不能再继承其他类,而Runable则没有这个限制。
  • 前两种方式都没办法拿到任务的返回结果,但是Futuretask方式可以。

运行线程