Java并发基础—线程创建

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

并发

  • java中实现一个并发的方式有很多
    • 比如实现一个Runable接口
public class testRunable implements Runnable{
    @Override
    public void run() {
        System.out.println("test");
    }
}
复制代码
  • run方法的代码是在一个线程汇总执行,
    • 线程的执行主要是一些利的指令,而有操作系统来提供
    • 我们根本没有必要一个一个任务一个线程,这样也造成了很大的资源浪费
    • 如果我们使用线程池,如下图

image.png

  • 当我们使用线程池的时候,newCachedThreadPool会产生一个很多短暂的任务
    • 这样每个任务会在空闲的线程上执行

线程的创建创建

  • 本身在Java中创建线程有三种方式
    • 继承Thread
    • 实现Runable接口
    • 使用FutureTask

1.Thread

  • 用类对象去调用start()启动此线程
    • 启动的过程是先获取到CPU资源,然后真正变更到运行状态

image.png 2.Runable

  • 没有任务就返回

image.png

3.FutureTask

  • 代码实现call方法
    • FutureTask对象的get()方法是等待任务执行完毕并返回结果

image.png

线程池

  • 线程池的诞生有种种原因
    • 首先我们去思考单线程的Executor,如果一个任务将另一个任务提交到同一个Executor
    • 但是会发生一直等待第一个任务的提交结果,所以这样会经常引发死锁
public ThreadPoolExecutor(int corePoolSize,
                         int maximumPoolSize,
                         long keepAliveTime,
                         TimeUnit unit,
                         BlockingQueue<Runnable> workQueue,
                         ThreadFactory threadFactory,
                         RejectedExecutionHandler handler) 
复制代码
  • 线程池的核心基本大小、最大线程数和存活时间都是来共同负责线程的创建和销毁的
    • 工作队列满了的时候就会创建超出这个数量的线程
    • 但是如果有的线程超过了存活时间那么肯定会被收回的

猜你喜欢

转载自juejin.im/post/7032831348129660935