第一周 4.12

每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。

Algorithm - LinkedList related

https://leetcode-cn.com/problems/reverse-linked-list/ 反转链表

https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 两两反转链表

https://leetcode-cn.com/problems/linked-list-cycle/ 环形链表

https://leetcode-cn.com/problems/linked-list-cycle-ii/ 环形链表 2

总结一下,链表的题最容易出 NullPointException 了,遍历时的条件比较难确定。

写完链表相关的题,想想能不能过一下的测试用例

  • 空链表
  • 只有一个节点的链表
  • 两个结点的链表
  • 代码在处理头结点和尾节点的时候,能不能顺利执行

Review - RESTful 风格概述

What is REST — A Simple Explanation for Beginners, Part 1: Introduction **原文地址

This is part 1 of 2 articles explaining the basic concepts of REST.

What you should know before reading this article:

You should have some understanding of what is HTTP and what is an API.

REST is an architectural style(建筑风格 - 编码规范?), or design pattern, for APIs.

Who invented REST?
REST was defined by Roy Fielding, a computer scientist. He presented the REST principles in his PhD (博士 论文) in 2000.

Before we dive(潜水) into(深入) what makes an API RESTful and what** constraints (约束)**and rules you should follow if you want to create RESTful APIs, let’s explain 2 key terms(术语):

  1. Client — the client is the person or software who uses the API. It can be a developer, for example you, as a developer, can use Twitter API to read and write data from Twitter, create a new tweet and do more actions in a program that you write. Your program will call Twitter’s API. The client can also be a web browser. When you go to Twitter website, your browser is the client who calls Twitter API and uses the returned data to render (渲染)information on the screen.
  2. Resource — a resource can be any object the API can provide information about. In Instagram’s API, for example, a resource can be a user, a photo, a hashtag(话题标志 类似 ##). Each resource has a unique identifier. The identifier can be a name or a number.

Now let’s get back to REST.

A RESTful web application exposes information about itself in the form of information about its resources. It also enables the client to take actions on those resources, such as create new resources (i.e. create a new user) or change existing resources (i.e. edit a post).

In order for your APIs to be RESTful, you have to follow a set of **constraints **when you write them. The REST set of constraints will make your APIs easier to use and also easier to discover, meaning a developer who is just starting to use your APIs will have an easier time learning how to do so.(易用,易读,易理解)

REST stands for REpresentational State Transfer(代表性的状态转移).

It means when a RESTful API is called, the server will transfer to the client a representation of the state of the requested resource.

服务端会响应客户端请求的资源,转换资源对于的状态

For example, when a developer calls Instagram API to fetch a specific user (the resource), the API will return the state of that user, including their name, the number of posts that user posted on Instagram so far, how many followers they have, and more.

The representation of the state can be in a JSON format, and probably for most APIs this is indeed the case. It can also be in XML or HTML format.

资源的状态一般是 JSON 格式,也可以是 xml 或者 html 形式。

What the server does when you, the client, call one of its APIs depends on 2 things that you need to provide to the server:

  1. An** identifier** for the resource you are interested in. This is the URL for the resource, also known as the endpoint. In fact, URL stands for Uniform Resource Locator.
  2. The** operation** you want the server to perform on that resource, in the form of an HTTP method, or verb. The common HTTP methods are GET, POST, PUT, and DELETE.

For example, fetching a specific Twitter user, using Twitter’s RESTful API, will require a URL that identify that user and the HTTP method GET.

Another example, this URL: www.twitter.com/jk_rowling has the unique identifier for J. K. Rowling’s Twitter user, which is her username, jk_rowling. Twitter uses the username as the identifier, and indeed Twitter usernames are unique — there are no 2 Twitter users with the same username.

The HTTP method GET indicates that we want to get the state of that user.

Continue to Part 2 to learn about the 6 REST constraints.

总结一下文章的主要内容

RESTful 是一中编程风格,具有 RESTful 风格的 API 可读性更好,对于开发者也更容易维护。

那么如何定位服务器上的资源状态呢?

  1. 唯一的身份标识,就像每个人的身份证号码一样,唯一且可以定位到具体的人。文中举的例子是 JK 罗琳的 twitter 个人主页,因为 twitter 上的用户名不允许重复,故通过 www.twitter.com/jk_rowling** **就会获得其在服务器上的唯一资源。通过特定格式传输给客户端,渲染。
  2. 你对指定资源的操作。你要如果操作服务器的资源。是 GET 访问,还是 POST。常见的 HTTP 请求 GET,PUT,DELETE,POST。
  • ** constraints**
  • dive,dive into
  • render

Technology - Thread

Java 线程池

“池”在计算机科学中的概念 (wiki词条)

In computer science, a pool is a collection of resources that are kept[clarification needed] ready to use, rather than acquired on use and released[clarification needed] afterwards.

通过维护一个池资源,提供

  • 高效的调用,
  • 有效的管理,
  • 更低的资源消耗
  • 避免频繁的创建和销毁

当然维护这么一个池也是需要消耗资源和复杂的管理工作的,只是频繁的创建销毁资源,使用池是更加高效的。对于计算机的资源,大家都是非常敏感的,引入的各种优化手段,也都是为了最大化地利用资源,个人认为 **Pool **也算是一种优化手段。

Java 中的线程池

和普通的池化资源不同,Java 的线程池采用的是 生产者-消费者模型,线程池扮演生产者的角色,为任务创建线程。待执行的任务提交给线程池,消耗(占用)线程池中的资源(线程)。

通过 ThreadPoolExecutor 创建一个线程池,先看一下其参数最全的构造方法。

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  • corePoolSize,核心线程池的线程数量(基本数量)
  • maximumPoolSize,线程池能容纳的最大数量
  • keepAliveTime & unit,线程空闲下来超过这个时间,且线程数大于核心线程池规定的数量,会被回收。 unit ,定义时间的单位
  • workQueue,当任务分配不到线程时,进入等待队列
  • threadFactory,可以自定义创建线程的方式
  • handler,线程池的拒绝策略

Java 线程池的主要处理流程

第一周 4.12_第1张图片

重点看一下队列拒绝策略的选择

  • workQueue,保存等待任务的阻塞队列。有以下选择
    • ArrayBlockingQueue
    • **LinkedBlockingQueue ***
    • SynchronousQueue,一个不存储元素的阻塞队列。每次插入的时候等待其他线程调用移除操作。
    • PriorityBlockingQueue,优先级无界队列
  • 拒绝策略,当等待队列和线程池都满了后,那么就拒绝任务。
    • AbortPolicy(默认策略):直接抛出异常。
    • CallerRunsPolicy:只用调用者所在线程来运行任务。
    • DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
    • DiscardPolicy:不处理,丢弃掉。

合理地配置线程池

线程池的服务对象是未来会提交的任务,合理配置线程池的目的也是提高执行任务的效率。

不同的任务类型需要不同配置的线程池,这也就取决于任务的性质,故我们来分析一下任务的性质

  • 任务涉及到的硬件资源:CPU 密集型,I/O 密集型
  • 优先级
  • 任务执行的时间长短
  • 有没有依赖外部资源,如数据库连接池

重点分析一下 CPU 和 I/O 密集型任务如何配置线程数:

CPU 密集型的任务,就是说大部分时间都在进行 CPU 计算,而很少的等待其他必要条件,例如等待 I/O。那么对于一个 8 核的 CPU 来说,创建 8 个线程来利用每个核去进行 CPU 计算(而不会因为等待 I/O 让 CPU 处于空闲状态,最大化利用 CPU 资源)。这种情况下创建过多线程只会增加上下文切换的成本。实际上一般会把线程数设置为 CPU 核数 + 1,多的一个线程来应对意外状况。

I/O 密集型的任务,线程就可能频繁让出 CPU 资源去等待 I/O,所以 CPU 处于空闲状态下的概率就会比较大。那么就需要创建比较多的线程去填补这个空闲时间,就可能提高 CPU 的利用率。一般把线程数设置为 2 * CPU 核数。

(参考内容《Java 并发编程的艺术》《Java 并发编程实战》)

Share

谈谈知识付费

因为本人是个程序员,所以先推荐一个我频繁使用的知识付费产品 “极客时间 App”。

知识付费好像是最近逐渐火起来的概念,其中我认为的标志性事件和产品 “得到 App”。

知识付费,就是人们付费,直接获取互联网上的优质内容,减少筛选的时间。因为互联网上的资料参差不齐,虽然其中不乏有优质内容,但是筛选需要花太多时间了。

这里我们讨论的肯定都是优质内容,那我们怎么判断内容好坏呢?

  • 互联网上对付费内容有透明的评价
  • 内容作者的信誉背书
  • 平台的内容一般也有要求

知识付费带来的好处

对于生产者:

  • 有钱赚
  • 刺激更多的优质内容

对于消费者:

  • 知识付费可以获得一个系统性的知识
  • 减少筛选信息的时间
  • 许多产品,购买了对应的专栏后,可以和作者读者讨论,获取反馈

你可能感兴趣的:(周学习任务,-,ARTS)