同步:
提示:这里简述项目相关背景:
例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)
问题描述:
提示:售票窗口进行买票的时候,票数不能够进行同步。造成超发现象。
@Test
public void test_ThreadSynchronized() {
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ; // 定义Thread对象
Thread t2 = new Thread(mt) ; // 定义Thread对象
Thread t3 = new Thread(mt) ; // 定义Thread对象
t1.start() ; // 启动线程
t2.start() ; // 启动线程
t3.start() ; // 启动线程
}
// 3.1、线程的强制执行
class ThreadSynchronized implements Runnable {
private int count = 10;
// 覆写run()方法,作为线程 的操作主体
public void run() {
while (count > 0) {
// 线程的休眠,在 test_ThreadSleep 演示的时候使用
try {
Thread.sleep(500); // 线程休眠
} catch (InterruptedException e) {
// System.out.println("3、休眠被终止");
return; // 返回调用处。 没有返回会多输出一个,为什么?
}
System.out.println(Thread.currentThread().getName() + "票数" + "count=" + this.count--);
}
}
}
//执行结果
/*
Thread-2运行count=9
Thread-1运行count=10
Thread-2运行count=7
Thread-1运行count=6
Thread-2运行count=5
Thread-3运行count=8
Thread-2运行count=3
Thread-1运行count=4
Thread-2运行count=1
Thread-3运行count=2
* */
原因分析:
没有进行数据的同步
解决方案:
加入同步。
class ThreadSynchronized implements Runnable {
private int count = 10;
// 覆写run()方法,作为线程 的操作主体
public void run() {
while (count > 0) {
synchronized (this) {
// 线程的休眠,在 test_ThreadSleep 演示的时候使用
try {
Thread.sleep(500); // 线程休眠
} catch (InterruptedException e) {
// System.out.println("3、休眠被终止");
return; // 返回调用处。 没有返回会多输出一个,为什么?
}
System.out.println(Thread.currentThread().getName() + "票数" + "count=" + this.count--);
}
}
}
}