Java多线程的实现方式

216 阅读2分钟

Java多线程的实现方式

  • 继承Thread
继承Thread,重写里面run方法,创建实例,执行start
优点:代码编写简单
缺点:没有返回值,继承一个类后,没办法继承其他类,拓展性较差
  • 代码
public class ThreadDemo extends Thread{

  @Override
  public void run() {
    System.out.println("继承Thread 重写run方法"+Thread.currentThread().getName());
  }
}

  public static void main(String[] args) {
    ThreadDemo demo = new ThreadDemo();
    demo.setName("llll");
    demo.start();
  }
  • 实现Runnable
自定义类实现Runnable,实现里面run方法,创建Thread类,使用Runnable接口的实现对象作为参数
传递给Thread对象,调用Start接口

优点:线程类可以实现多个接口,可以在继承一个类
缺点:没有返回值,不能直接启动,需要通过狗在一个Thread实例传递进去启动
  • 代码
public class ThreadDemo2 implements Runnable{

  @Override
  public void run() {
    System.out.println("实现Runnable接口");
  }
}

  public static void main(String[] args) {
   ThreadDemo2 demo2 = new ThreadDemo2();

//   Thread thread = new Thread(()->{
//     System.out.println("匿名内部类方式");
//   });
    Runnable target;
    Thread thread = new Thread(demo2);
   thread.start();

  }
  • 通过Callable和FutureTask方式
创建callable接口的实现类,并实现call方法,结合FutureTask类包装Callable对象,实现多线程
优点:有返回值 拓展性高
缺点:JDK5之后才支持,需要重写call方法,结合多个类例如FutureTask和Thread类
  • 代码
public class MyTask<Object> implements Callable {

  @Override
  public Object call() throws Exception {
    System.out.println("Callable"+Thread.currentThread().getName());
    return (Object) "有返回值";
  }
}

public class main1 {

  public static void main(String[] args) {

    MyTask myTask = new MyTask();

    FutureTask<Object> futureTask = new FutureTask<>(myTask);

    Thread thread = new Thread(futureTask);

    thread.setName("llll");

    thread.start();

  }
}
  • 通过创建线程池创建线程
自定义Runnable接口,实现run方法,创建线程池,调用执行方法并传入对象
优点:安全高性能,复用线程
缺点: jdk5后才支持,需要结合Runnable进行使用
public class ThreadDemo4 implements Runnable {
​
    @Override
    public void run() {
        System.out.println("通过线程池+runnable实现多线程,名称:"+Thread.currentThread().getName());
    }
}
​
​
public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
​
        for(int i=0;i<10;i++){
            executorService.execute(new ThreadDemo4());
        }
​
​
        System.out.println("主线程名称:"+Thread.currentThread().getName());
​
        //关闭线程池
        executorService.shutdown();
}