JUC
1. 什么是JUC?
2. 什么是进程/线程?
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
3. 什么是并发/并行?
并发:同一时刻多个线程在访问同一个资源,多个线程对一个点
并行:多项工作一起执行,之后再汇总
例子:泡方便面,电水壶烧水,一边撕调料倒入桶中
4. 卖票例子
/*
题目:三个售票员 卖出 30张票
多线程编码套路+模板
1. 在高内聚低耦合的前提下,线程 操作(对外暴露的调用方法) 资源类
2.
*/
class Ticket { //资源类
private int number = 30;
private Lock lock = new ReentrantLock();
public void saleTicket() { //操作
lock.lock();
try{
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (number--) + "\t还剩下:" + number);
}
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 40; i++) {
ticket.saleTicket();
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 40; i++) {
ticket.saleTicket();
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 40; i++) {
ticket.saleTicket();
}
}
}, "C").start();
}
}
//输出
A 卖出第:30 还剩下:29
C 卖出第:29 还剩下:28
C 卖出第:28 还剩下:27
C 卖出第:27 还剩下:26
C 卖出第:26 还剩下:25
C 卖出第:25 还剩下:24
C 卖出第:24 还剩下:23
C 卖出第:23 还剩下:22
C 卖出第:22 还剩下:21
C 卖出第:21 还剩下:20
C 卖出第:20 还剩下:19
C 卖出第:19 还剩下:18
C 卖出第:18 还剩下:17
C 卖出第:17 还剩下:16
C 卖出第:16 还剩下:15
C 卖出第:15 还剩下:14
C 卖出第:14 还剩下:13
C 卖出第:13 还剩下:12
C 卖出第:12 还剩下:11
C 卖出第:11 还剩下:10
C 卖出第:10 还剩下:9
C 卖出第:9 还剩下:8
C 卖出第:8 还剩下:7
B 卖出第:7 还剩下:6
B 卖出第:6 还剩下:5
B 卖出第:5 还剩下:4
B 卖出第:4 还剩下:3
B 卖出第:3 还剩下:2
B 卖出第:2 还剩下:1
B 卖出第:1 还剩下:0
//lambda
class Ticket { //资源类
private int number = 30;
private Lock lock = new ReentrantLock();
public void saleTicket() { //操作
lock.lock();
try{
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (number--) + "\t还剩下:" + number);
}
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(()->{for(int i=1; i<=40; i++) ticket.saleTicket();},"A").start();
new Thread(()->{for(int i=1; i<=40; i++) ticket.saleTicket();},"B").start();
new Thread(()->{for(int i=1; i<=40; i++) ticket.saleTicket();},"C").start();
}
}
5. wait/sleep
功能都是当前线程暂停,有什么区别?
wait放开手去睡,放开手里的锁
sleep握紧手去睡,醒了手里还有锁