美文网首页
线程的基础知识

线程的基础知识

作者: 王龙江_3c83 | 来源:发表于2019-03-19 09:54 被阅读0次

    1. 线程的实现

    1.1 实现方法

    实现方法 使用方法
    继承 Thread 的方法,重写 run 方法。 调用 start 方法。
    实现 Runnable 接口,实现 run 方法。 使用该对象构造 Thread 类,调用 Thread 对象的 start 方法。
    调用线程池 execute 方法。
    调用 线程池 execute 方法。
    调用 submit 方法提交。
    构造 FutureTask 对象,使用 submit 方法提交。
    实现 Callable 接口,实现 call 方法。 调用 submit 方法提交。

    1.2 Future & FutureTask

    方法 功能
    cancel 取消任务
    isDone 判断任务是否完成
    isCancelled 是否成功取消
    get 获取任务返回值,该方法会阻塞知道获取到结果。
    get(long timeout, TimeUnit unit)

    FutureTask 实现 RunnableFuture 接口,RunnableFuture 继承了 Future 和 Runnable 接口。

    2. 线程的状态和转换方法

    2.1 线程的状态

    屏幕快照 2019-03-20 下午6.47.29.png
    状态 解释
    New 调用 new Thread() 方法后进入 New 状态。
    Ready(就绪状态) 调用 .start()方法 New 状态转为 Ready 状态,锁池状态获得锁 转为 Ready 状态。
    Running(运行状态) Runnable 获得时间片,转为 Running 状态。
    Blocked(阻塞状态) 等待锁。
    Waiting 等待阻塞,本线程使用的对象被其他线程调用 o.wait() ,t.join() ,LockSupport.park() 方法,线程由 Running 状态转为 Waiting 状态,当 o.notifyAll() 被调用时,转为 Runnable 状态。
    Waiting(time) 调用 wait(timeout)、join(timeout)、Thread.sleep(sleepTime),LockSupport.parkNanos() 后由 Running转为 Timed Waiting 状态。
    Terminated 调用 thread.terminated 方法。

    2.2 状态转换方法

    方法 功能
    join() 见名知意,加入,Thread 对象的成员方法。
    yield() 给其他同优先级和高优先级线程让路,线程状态由 Running 转为 Ready,Thread 类的静态方法。
    wait(long) 只能在同步方法中使用,线程状态由 Runnable 转为 Timed Waiting ,等待让出锁,进入对象的等待队列中。
    wait() 只能在同步方法中使用,线程状态由 Runnable 转为 Waiting ,等待让出锁。
    notify() 唤醒 wait 线程,处于该对象等待池中被唤醒的线程进入该对象的锁池中,线程状态由Waiting 转为 Blocked。随机选取一个等待池中的线程,进入锁池去竞争获取锁的机会。
    notifyAll() 让所有处于等待池中的线程,进入锁池去竞争获取锁的机会。
    sleep(long) 可以在任何地方使用,等待不让锁,线程状态由 Runnable 转为 Waiting 。

    3. 线程池的实现

    3.1 ThreadPoolExecutor(ExcutorService 的基类) 的构造参数

    参数 概念
    corePoolSize 线程池中的线程数量小于该值时,创建线程执行任务,而不会使用空闲线程。
    maxPoolSize 最大线程数。
    keepAliveTime 线程没有任务执行时最多保持多久的时间终止。
    unit 时间的单位。
    workQueue 阻塞队列,存储等待执行的任务。线程数大于等于 corePoolSize 小于 maxPoolSize 时,该队列未满则将线程放入该队列,满则床创建新线程;如果线程数量大于 maxPoolSize ,且 workQueue 满,使用拒绝策略,有界队列和无界队列。
    threadFactory 线程工厂,提交后 submit 的方法不执行。
    rejectHandler 线程被拒绝时调用的方法。
    public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler)
    

    3.2 新建线程池对象

    方法 功能
    Excutors newFixedThreadPool 返回 ThreadPoolExecutor(实现了 ExecutorService 接口) 对象。
    Excutors newCachedThreadPool 返回 ThreadPoolExecutor 对象。
    Excutors newScheduledThreadPool 返回 ScheduledThreadPoolExecutor(实现了 ScheduledExecutorService 接口) 对象。
    Excutors newSingleThreadPool 返回 ThreadPoolExecutor 对象。

    3.3 线程池的常用方法

    线程池继承与实现.png
    接口/类 方法 功能
    Executor void execute(Runnable command) 参数实现 Runnable 接口,无返回值。
    ExecutorService shutdown 等待提交的任务执行完。
    ExecutorService List<Runnable> shutdownNow() 不等待任务执行完。
    AbstractExecutorService Future<T> submit(Callable<T> task) 参数实现 Callable 接口,返回值类型为 T。
    AbstractExecutorService Future<T> submit(Runnable task, T result)
    AbstractExecutorService Future<?> submit(Runnable task)
    ThreadPoolExecutor getTaskCount 线程池中已执行和未执行的线程总数。
    ThreadPoolExecutor getCompletedTaskCount 线程池中已执行,等于结果 1 减去队列中的线程个数。
    ThreadPoolExecutor getPoolSize 线程池中现有的线程数。
    ThreadPoolExecutor getActiveCount 线程池中正在执行任务的线程数量。
    ScheduledExecutorService public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);
    public <V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);

    4. AQS

    4.1 CyclicBarrier

    4.1.1 功能

    CyclicBarrier:某个线程运行到某个之后,该线程停止运行,直到所有的线程都达到这个点,所有线程才能重新运行。线程互相等待,直到准备就绪。如果调用 c.await() 的次数小于 n,线程卡死?

    4.1.2 使用步骤

    • 主线程调用 new CyclicBarrier(n) 方法创建 CyclicBarrier 对象;
    • 构造线程时,将 CyclicBarrier 对象传入。
    • 子线程调用 await() 方法,当第 n 个线程调用 await() 方法,所有线程继续执行。

    4.2 CountDownLatch

    4.2.2 使用步骤

    • 主线程调用 new CountDownLatch(n) 方法创建 CountDownLatch 对象。
    • 构造线程时,将 CountDownLatch 对象传入。
    • 控制主线程调用 await() 方法等待所有子线程完成。
    • 在子线程完成任务,调用 countDown() 方法,当 countDown() 方法调用测试等于 n 时,主线程继续执行。

    4.3 信号量(Semaphore)

    4.3.1 功能

    控制同时放行的进程数。

    4.3.2 使用步骤

    • 主函数使用 Semaphore(int permits,boolean fair) 构造信号量对象,permits 为线程数目,fair 表示是否启用先进先出的原则进行公平调度。
    • 构造线程时,将 Semaphore 对象传入。
    • 线程执行前,调用 acquire() 方法获得许可,如果可用许可数大于 0,继续执行,否则阻塞等待。线程可调用 semaphore.availablePermits() 方法查看可用许可证数目。
    • 线程执行完任务后,调用 semaphore.release() 方法释放许可。

    4.4 BlockingQueue

    通过 Lock 和 Condition 实现。

    参考资料

    相关文章

      网友评论

          本文标题:线程的基础知识

          本文链接:https://www.haomeiwen.com/subject/xziwmqtx.html