java.util.concurrent 并发编程中使用的工具类
一、进程/线程是什么?
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。
使用QQ,查看进程一定有一个QQ.exe的进程,我可以用qq和A文字聊天,和B视频聊天,给C传文件,给D发一段语言,QQ支持录入信息的搜索
二、多线程卖票
售票 三个售票员 卖出 30张票
在高内聚低耦合的情况下 线程 操作 资源类
(1)传统 synchronized 锁方法
//资源类
class Ticket { private int num = 30;
//卖出票 操作方法 public synchronized void saleTicket() { if (num > 0) { System.out.println(Thread.currentThread().getName() + "卖出第" + (num--) + "张票,还剩下:" + num); } } } public class SaleTicket { public static void main(String[] args) { Ticket1 ticket = new Ticket1(); // Thread(Runnable target,String name) 匿名内部类 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(); } }
(2)JUC Lock锁方法
ReentrantLock和synchronized比较详见https://www.cnblogs.com/takumicx/p/9338983.html#%E6%80%BB%E7%BB%93
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 资源类 使用lock锁
*/
class Ticket1 {
private int num = 30;
//ReentrantLock是可重入的独占锁。比起synchronized功能更加丰富,支持公平锁实现,支持中断响应以及限时等待等等。可以配合一个或多个Condition条件方便的实现等待通知机制。
private final Lock lock = new ReentrantLock(true);
public void saleTicket() {
lock.lock();
try {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第" + (num--) + "张票,还剩下:" + num);
}
} finally {
lock.unlock();
}
}
}
/**
* 售票 三个售票员 卖出 30张票
* <p>
* 在高内聚低耦合的情况下 线程 操作 资源类
*/
public class SaleTicket {
public static void main(String[] args) {
Ticket1 ticket = new Ticket1();
// Thread(Runnable target,String name) 匿名内部类
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();
}
}