Java之多线程的工程代码编写思维方式
题目:三个售票员卖出30张票,用线程模拟。
前言:
-
本文涉及
synchronized
、Lock
和拉姆达表达式(Lambda Expressions)
,前两知识点推荐看这两篇写的很好的详解文章。
多线程技巧口诀:
- 线程 操作 资源类
- 高内聚 低耦合
未优化的代码:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket {
private int number = 30; //模拟票数
private int num = 1;
public synchronized void sale() {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (num++)+ "张,还剩下:" + --number);
}
}
}
public class ThreadDemo4 {
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.sale();
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 40; i++) {
ticket.sale();
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < 40; i++) {
ticket.sale();
}
}
}, "C").start();
}
}
结果部分截图:
利用拉姆达表达式(Lambda Expressions)
和Lock
对代码进行优化。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket {
private int number = 30; //模拟票数
private Lock lock = new ReentrantLock();
private int num = 1;
public void sale() {
lock.lock();
try {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "\t卖出第:" + (num++) + "张,还剩下:" + --number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> {for (int i = 1; i < 40; i++) {ticket.sale();} }, "A").start();
new Thread(() -> {for (int i = 1; i < 40; i++) {ticket.sale();} }, "B").start();
new Thread(() -> {for (int i = 1; i < 40; i++) {ticket.sale();} }, "C").start();
}
}
---
结果部分截图: