ThreadPool线程池相关知识

文章介绍了Java中创建线程的四种方式,包括继承Thread类、实现Runnable接口、使用Callable和Future,以及通过线程池创建线程。重点讲述了线程池的概念、优点,并展示了使用ExecutorService创建线程池执行execute和submit任务的示例,包括嵌套执行的情况。
摘要由CSDN通过智能技术生成

ThreadPool线程池相关知识

本片文章默认读者已经有进程,线程相关的知识!!!

创建进程的方式
1.继承Thread类进行创建
class MyThread extends Thread{
  @Override//重写run方法
  public void run() {
    // TODO Auto-generated method stub
    System.out.println("extend Thread!!!");
  }
} 
public static void main(String[] args) throws InterruptedException, ExecutionException {
  MyThread myThread = new MyThread();
  myThread.start();

}
2.实现Runnable接口
public static void main(String[] args) throws InterruptedException, ExecutionException {
  MyThread myThread = new MyThread();
  Thread thread = new Thread(myThread);
  thread.start();
}
class MyThread implements Runnable{
  @Override
  public void run() {
    // TODO Auto-generated method stub
    System.out.println("implement Runnable!!!");
  }

当然可以使用内部类和Lamada函数式编程,结合Thread和Runnable接口

public static void main(String[] args) throws InterruptedException, ExecutionException {
  Thread thread = new Thread(() -> System.out.println("Combine Thread and Runnable"));
  thread.start(); 
}
3.使用Callable和Future创建线程

​ 和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要 强大。

​ call()方法可以有返回值!!!!

​ call()方法可以声明抛出异常

FutureTask futureTask = new FutureTask<>(new Callable<String>() {
  @Override
  public String call() throws Exception {
    // TODO Auto-generated method stub
    return "Create By FutureTask";
  }
});
Thread myThread = new Thread(futureTask);
myThread.start();
System.out.println(futureTask.get());//会输出"Create By FutureTask"

还有一个接口名为Future接口,一般用来接受线程池返回的Callable接口,接下来讲解线程池会使用到

4.使用线程池进行创建
  1. 何为线程池

    线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销。

  2. 为什么要使用线程池?

    • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
    • 提高线程的可管理性。

关于线程池的知识可以取看 线程池详解 的讲解,里面汇总了大量的线程池的知识!本篇文章主要是讲解利用线程池执行线程

1.使用execute执行线程

ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {//使用线程池创建执行Runnable线程
  @Override
  public void run() {
    System.out.println("Use ThreadPool");
  }
});
service.shutdown();

2.使用submit执行线程

ExecutorService service = Executors.newFixedThreadPool(2);
Future future = service.submit(new Callable<String>() {//Future用于接收callable的返回值
  @Override
  public String call() throws Exception {
    // TODO Auto-generated method stub
    return "Use ThreadPool";
  }
});
System.out.println(future.get()); 
service.shutdown();

3.execute与submit的嵌套执行

ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
  @Override
  public void run() {
    Future  future = service.submit(new Callable<String>() {
      @Override
      public String call() throws Exception {
        // TODO Auto-generated method stub
        return "嵌套";
      }
    });
    try {
      System.out.println(future.get());
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ExecutionException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
});
service.shutdown();

4.execute嵌套execute

ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
  @Override
  public void run() {
    service.execute(new Runnable() {
      @Override
      public void run() {
        System.out.println("嵌套");
      }
    });
  }
});
Thread.sleep(1000);
service.shutdown();

以上就是常见的线程创建的四种方法,希望对大家有所帮助!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值