发表于: 2020-08-28 23:09:26

1 1419


今天完成的事情

1.ThreadLocal 的使用与实现

2.线程、Runnable、Callable的关系

3.多线程中断

4.SQL 创建计算字段


收获

1. 只有 Thread 代表线程,那么 Runnable 呢?

  • Runnable 代表一个【任务、task】(说明书)
  • Runnable 可以被任何一个线程(工人)执行。


2. 为什么需要线程池?

开启一个线程的开销是非常大的,为了减少频繁开启与销毁线程带来的消耗我们需要预先准一个线程池,当我们需要开启一个线程的时候就从线程池里面取一个线程用,用完了再还回去。

整个过程中由线程池负责管理线程的开启与销毁。



3. 什么是 Callable ?

Runnable 从 jdk 1.0 开始引入,Callable 从 jdk 1.5 引入。

Callable 接口相较于 Runnable 多了返回值和异常抛出。

Runnable 接口:

@FunctionalInterface
public interface Runnable {
/**
    * When an object implementing interface <code>Runnable</code> is used
    * to create a thread, starting the thread causes the object's
    * <code>run</code> method to be called in that separately executing
    * thread.
    * <p>
    * The general contract of the method <code>run</code> is that it may
    * take any action whatsoever.
    *
    * @see     java.lang.Thread#run()
    */
   public abstract void run();
}

Callable 接口:

@FunctionalInterface
public interface Callable<V> {
/**
    * Computes a result, or throws an exception if unable to do so.
    *
    * @return computed result
    * @throws Exception if unable to compute a result
    */
   V call() throws Exception;
}


4. 有了 Runnable 为什么还需要 Callable?

  • Runnbale 存在限制
    • 不能返回值
    • 不能抛出异常

Callable 解决了上述的问题。


5. 线程中断

这个知识点只需要知道就好

常见的抛出 InterruptedException 的方法:

Thread.sleep

BlockingQueue.put/take


6. 什么样的线程会响应中断?

Thread.interrupt() 唯一的用处就是取消一个耗时的操作,但是线程会不会响应就取决于线程内部方法的实现,如果线程内部没有做任何响应中断点的逻辑,那么对它发送中断是没有用的。


7. 中断是什么?

中断的实质就是 Thread 实例内部的一个中断标志位,然后由线程内部的逻辑来决定如何处理这个中断标志位。

Thread 设置中断标志的方法:(太难排版了,直接截图好了)

这个方法最后一行调用了 interrupt0() 这个方法,但是这个方法是由其他语言实现的(方法前有 native 关键字,需要查看 JDK 源码才能知道怎么写的)。

 private native void interrupt0();


在线程中判断中断的方法:

通过查看 Thread.isInterrupted() 方法的源码我们可以看到它也是通过调用原生方法完成的,并且会抹除中断标志位。


8. 一些关于中断的实例

不响应中断


中断失败


中断成功


9. 什么是计算字段?

我们存储在数据库内部的字段往往不是可以直接使用的格式,比如:

  • 显示公司名字的时候还需要显示公司地址,可是这两个信息不在同一个字段内
  • 商品库存表存储了商品数量以及单价,但是我们打印订单的时候需要输出总价格


在上述的例子中我们需要直接从数据库中检索、转换、计算或者格式化数据,然后再再客户端应用程序中重新格式化。

这个时候计算字段就可以排上用场了。计算字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内创建的。


10. 为什么要使用计算字段?

在 SQL 语句中完成的许多转换与格式化工作都可以直接在客户端应用程序内完成。但是一般来说,在数据库服务器上完成这些操作比在客户端内完成要快得多。


11. 拼接字段

加入现在有一张商品表,内部存储了商品名称以及商品价格两个字段,我们想把这两个信息通过特定的格式展示出来。

不同的 DBMS 对字段的拼接实现方法不同,在 MySQL 中我们需要使用 CONCAT(string, ```) 函数来实现。

SELECT CONCAT('商品名: ', `name`, ' 单价: ',price, '¥')

FROM goods;

运行结果:


但是在我测试的时候发现上面这段 SQL 会报错:

SELECT CONCAT('商品名: ', `name`, ' 单价: ',price, '¥')

FROM goods

> 1271 - Illegal mix of collations for operation 'concat'> 时间: 0.001s

报错的原因是 MySQL 处理 SQL 的时候默认为 UTF-8 字符集,但是实际上数据表是 latin1 字符集,使用以下 SQL 修改数据表为 UTF-8 字符集后正常运行

ALTER TABLE goods CONVERT TO CHARACTER SET 'utf8' ;


12. 使用别名

在上面的演示中我们可以发现数据可以按照我们的需求取出来,但是取出来的数据字段名是不太友好的,实际上它根本就没有字段名,只是一个值而已。

一个没有列名的数据是没法被客户端引用的,我们需要为这些数据指定一个列名。

SELECT CONCAT('商品名: ', `name`, ' 单价: ',price, '¥') AS goods_info

FROM goods;

这个时候我们就会发现取出来的数据带上了我们指定的列名:


SELECT CONCAT('商品名: ', `name`, ' 单价: ',price, '¥') AS goods_info,

           CONCAT('库存总价值: ', price*in_stock, '¥') AS total_value

FROM goods;



明天的计划

1. 阅读小程序文档,了解小程序后端的流程

等了这么久复盘车队终于可以开动了,小程序之前没做过,明天研究一下该怎么做,主要是注册和登录这块。


返回列表 返回列表
评论

    分享到