前言
JUC概念
java.util.concurrent
在并发编程中使用的工具类,专门用于多线程的开发
synchronized与Lock的区别
Thread
的几个重要方法。
a、start()
方法,调用该方法开始执行该线程;
b、stop()
方法,调用该方法强制结束该线程执行;
c、join()
方法,调用该方法等待该线程结束。
d、sleep()
方法,调用该方法该线程进入等待。
e、run()
方法,调用该方法直接执行线程的run()方法,但是线程调用start()方法时也会运行run()方法,区别就是一个是由线程调度运行run()方法,一个是直接调用了线程中的run()方法!!
注意
wait()与notify()方法是Object的方法,不是Thread的方法!!同时,wait()与notify()会配合使用,分别表示线程挂起和线程恢复。
一、Synchronized示例
Synchronized
会自动加锁和解锁
package com.juc;
/**
* @author niuben
*/
//第一步,创建资源类
class Ticket{
//票数
private int number = 30;
//买票方法
public synchronized void sale(){
//判断是否还存在票
if(number > 0){
System.out.println(Thread.currentThread().getName()+":卖出:"+(number--)+"剩下:"+number);
}
}
}
public class SaleTicket {
//第二部,创建多个线程,售票员
public static void main(String[] args) {
//创建资源对象
Ticket ticket = new Ticket();
//创建三个线程
new Thread(new Runnable() {
@Override
public void run() {
//调用买票的方法
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
},"售票员1").start();
new Thread(new Runnable() {
@Override
public void run() {
//调用买票的方法
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
},"售票员2").start();
new Thread(new Runnable() {
@Override
public void run() {
//调用买票的方法
for (int i = 0; i < 40; i++) {
ticket.sale();
}
}
},"售票员3").start();
}
}
运行结果
二、Lock示例
Lock
需要手动进行加锁、解锁
package com.juc;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author niuben
*/
//第一步创建资源类
class LTicket{
//票数
private int number = 30;
//创建可重入锁
private final ReentrantLock lock = new ReentrantLock();
//买票方法
public synchronized void sale(){
//上锁
lock.lock();
try {
//判断是否还存在票
if(number > 0){
System.out.println(Thread.currentThread().getName()+":卖出:"+(number--)+"剩下:"+number);
}
}finally {
//解锁
lock.unlock();
}
}
}
public class LSaleTicket {
//第二步创建多个线程,调用资源类的方法
//创建三个线程
public static void main(String[] args) {
LTicket ticket = new LTicket();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
},"售票员A").start();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
},"售票员B").start();
new Thread(() -> {
for (int i = 0; i < 40; i++) {
ticket.sale();
}
},"售票员C").start();
}
}
运行结果