Nixo Home

对Thread的理解?线程状态?阻塞和运行状态区别?

字数统计: 473阅读时长: 1 min
2019/07/05 Share

对Thread的理解,也可以理解为什么是Thread?他能做什么?

  • 线程是CPU调度的基本单位,一个进程可以有多个线程

在java中线程有四种实现方式

  • 继承或者创建Thread类 并实现run方法;
  • 实现Ranable接口,实现接口中run方法;
  • 实现Callabe接口,通过FutureTask包装器来创建Thread线程
    Callable<V> oneCallable = new SomeCallable<V>();   
    //由Callable<Integer>创建一个FutureTask<Integer>对象:   
    FutureTask<V> oneTask = new FutureTask<V>(oneCallable);   
    //注释:FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口。 
    //由FutureTask<Integer>创建一个Thread对象:   
    Thread oneThread = new Thread(oneTask);   
    oneThread.start();   
    //至此,一个线程就创建完成了。
  • 通过线程池创建线程

既然你说到了线程池,来讲讲线程池有几种?他们的区别是什么?

什么是线程池?
线程池就是创建多个线程并且进行管理的容器。

线程池一共有四种

  • fixedThreadPool()启动固定线程数的线程池
  • CachedThreadPool()按需分配的线程池
  • ScheduledThreadPool()定时定期执行任务的线程池
  • ThreadPoolExecutor()指定线程数的线程池

Thread的运行状态

  • 创建new (new Thread)
  • 就绪runnable (创建后run方法之前的时候)
  • 运行running (获得CPU执行时间 run方法中)
  • 阻塞block(被同步代码块,或者IO阻塞,想要获取锁的时候,阻塞)
  • 睡眠time waiting(sleep方法调用 睡眠时间已满或者被notify唤醒)
  • 等待waiting (等待另一个线程调度器唤醒的状态,例如Object.wait()、Thread.join()、Lock.await()、Lock.lock())

阻塞和运行的区别

  • 阻塞不持有锁(等待获取对象的锁释放)而 运行状态持有锁(加锁在运行)。
  • 阻塞不持有CPU的时间片,运行持有。
CATALOG
  1. 1. 对Thread的理解,也可以理解为什么是Thread?他能做什么?
    1. 1.1. 在java中线程有四种实现方式
    2. 1.2. 既然你说到了线程池,来讲讲线程池有几种?他们的区别是什么?
      1. 1.2.1. 线程池一共有四种
  2. 2. Thread的运行状态
  3. 3. 阻塞和运行的区别