SQL使用要点
内连接、外连接1231.内连接是将两张表满足关联条件的数据查询出来2.左外连接是以左表为主表拼接其他表后再根据关联条件查询出来的,左外连接只会在乎左表中的数据,不会在乎其他表是否存在对应的数据3.右外连接是以右表为主表拼接其他表后再根据关联条件查询出来的,右外连接只会在乎右表中的数据,不会在乎其他表是否存在对应的数据
内连接
SQL语句
1select * from user u, score s where u.id = s.uid;
查询结果
左外连接
SQL语句
1select * from user t left join score s on t.id = s.uid;
查询结果
右外连接
SQL语句
1select * from score t right join user u on t.uid = u.id;
查询结果
group by和having
用户表添加一个id相同的数据
根据用户id分组,查询占用用户id和使用相同用户id的数量
1select id, count(id) quantity from user group by ...
视频转gif
1.点击打开
2.选中一个视频,点击打开
3.左右推动两个灰色小块可以限制可展示范围,拖动蓝色小块可以查看所在位置的内容
4.点击文件,再点击存储为…
5.选择合适的保存路径,修改文件名称
*6.选择保存类型为GIF(.GIF)后,点击保存**
7.等待出现GIF存储选项出现后,点击确定
8.等待存储进度条消失即可
线程并发类
通过wait,notify管理并发12341.两个方法都需要放置到synchronized的作用域中2.一旦执行wait方法,会释放synchronized所关联的锁,进入阻塞状态,无法再次主动地到可执行状态3.一旦执行notify方法,会通知因调用wait方法而等待的线程,如有多个线程等待,则会任意挑选一个线程来唤醒4.notifyAll会唤醒因wait而进入到阻塞状态的线程,但他们都未得到锁,因此会竞争锁,得到锁的继续执行,在锁被释放后,其他线程会继续竞争,依次类推
以生产者消费者问题观察wait和notify
基于Object类的wait、notify和notifyAll的方法,只能建立一个阻塞队列
代码展示12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989 ...
Exception in thread "main" java.lang.OutOfMemoryError
异常信息1234Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.concurrent.ArrayBlockingQueue.<init>(ArrayBlockingQueue.java:255) at java.util.concurrent.ArrayBlockingQueue.<init>(ArrayBlockingQueue.java:239) at com.itpm.project.ThreadLocalTest.main(ThreadLocalTest.java:34)
异常原因11.创建的ArrayBlockingQueue线程缓存队列过多
Exception in thread "main" java.util.concurrent.RejectedExecutionException
异常信息123456Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.itpm.project.ThreadLocalTest@4aa8f0b4 rejected from java.util.concurrent.ThreadPoolExecutor@7960847b[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830) at java.util.concurrent.Thr ...
ThreadPoolExecutor线程池
为什么要使用线程池?1避免因线程切换而造成的性能损耗
构造ThreadPoolExecutor线程池的参数
1234567891011corePoolSize: 核心线程数maximumPoolSize: 最大线程数keepAliveTime: 线程空闲时间unit: keepAliveTime参数单位workQueue: 缓存线程任务阻塞队列threadFactory: 指定创建线程的工厂handler: 当提交任务数超过maximumPoolSize+workQueue之和时,任务会交给handler来处理,有4个取值: 1.new ThreadPoolExecutor.CallerRunsPolicy(): 拒绝任务的处理程序,它直接在execute方法的调用线程中运行拒绝任务 2.new ThreadPoolExecutor.AbortPolicy(): 抛出RejectedExecutionException拒绝任务的处理程序 3.new ThreadPoolExecutor.DiscardPolicy(): 拒绝任务的处理程序,静默丢弃被拒绝的任务 4.new Thread ...
ThreadLocal线程内部存储类
ThreadLocal的使用代码展示1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class ThreadLocalTest implements Runnable { private final ThreadLocal<Integer> local = ThreadLocal.withInitial(() -> 0); private final ThreadLocal<String> stringLocal = new ThreadLocal<>(); public Integer add() { local.set(local.get() + 1); return local.get() + 1; } public String setStringLocal(String threadName) { ...
线程锁
可重入锁1也叫可递归锁,当同一线程再次进入同步代码时,可以使用自己已获取到的锁;其目的是当同一线程多次获取到的是同一把锁能防止死锁的发生
代码展示12345678910111213141516171819202122232425262728293031323334353637383940414243444546import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class LockTest implements Runnable { private Lock lock = new ReentrantLock(); public void get() { lock.lock(); System.out.println("get方法的线程id: " + Thread.currentThread().getId()); set(); lock.unlo ...
synchronized关键字
概念1synchronized是同步锁,可重入锁
作用在不同地方的不同效果修饰代码块1修饰以{}包含的代码块,当多个并发线程到达时,只有一个线程能够执行,其他线程则被阻塞等待;synchronized作用的对象(锁定的对象)是调用代码块的实例对象
同一对象加锁
在同一个对象上加锁,多个线程会依次进入代码块
代码展示123456789101112131415161718192021222324252627282930313233public class SynchronizedTest implements Runnable { /* int的默认值为0 */ private int i; @Override public void run() { synchronized (this) { for (int j = 0; j < 10; j++) { System.out.println(Thread.currentThread( ...
volatile关键字
volatile关键字的特性123451.不能保证原子性:2.能避免指令重排: 在编译和执行代码时,出于优化考虑,会重排指令;大多数场景下指令重排不会影响结果,但在多线程环境下可能会有问题3.使变量在线程间都可见: 在线程内存中,如果进行写操作,能够立即写回到主内存中,如此该值会在其他线程内存中失效;也就是说,其他内存如果想要再次读取该值,就需要到主内存中去读
特性解释1234原子性: 一个操作或多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行指令重排: 概念: 指JVM在编译Java代码或CPU在执行JVM字节码时,对现有的指令顺序进行重新排序 目的: 在不改变(单线程)程序执行结果的前提下,优化程序的运行效率
不能保证原子性代码展示123456789101112131415161718192021222324252627282930public class VOLATILETest { /* int的默认值为0 */ private static volatile int i; public static void add() ...