The Java thread uses synchronous locks to alternately print odd and even numbers
- 2021-06-28 12:25:00
- OfStack
How do I ensure consistency of threads'execution results when multithreading the same object?We need a synchronization lock on the thread operation object. (This is an interview question)
Requirement Description
1-20 digits
A threads print odd numbers: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
B threads print even numbers: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
The C thread prints the result "success" after the two AB threads have executed.
Thread Code Implementation
Num.java
package com.boonya.thread.test;
/**
* @ClassName: Num
* @Description: TODO( Lock Computing Object )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 22:47
*/
public class Num {
int value=1;
}
AThread.java
package com.boonya.thread.test;
/**
* @ClassName: AThread
* @Description: TODO( Odd Threads )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 22:26
*/
public class AThread implements Runnable{
Num num;
public AThread(Num num){
this.num=num;
}
public void run() {
while (num.value<20){
synchronized (num){
if(num.value%2!=0){
System.out.println("AThread:"+ num.value);
num.value++;
}
}
}
}
}
BThread.java
package com.boonya.thread.test;
/**
* @ClassName: BThread
* @Description: TODO( Even Threads )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 22:26
*/
public class BThread implements Runnable {
Num num;
public BThread(Num num){
this.num=num;
}
public void run() {
while (num.value<=20){
synchronized (num){
if(num.value%2==0){
System.out.println("BThread:"+ num.value);
num.value++;
}
}
}
}
}
CThread.java
package com.boonya.thread.test;
/**
* @ClassName: CThread
* @Description: TODO( Waiting for Result Threads )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 22:26
*/
public class CThread implements Runnable {
Num num;
public CThread(Num num){
this.num=num;
}
public void run() {
while (num.value<20){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("CThread:success!");
}
}
MainTest.java
package com.boonya.thread.test;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: MainTest
* @Description: TODO( Thread Test )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 21:54
*/
public class MainTest {
public static void main(String[] args) {
Num num=new Num();
Thread a=new Thread(new AThread(num));
Thread b=new Thread(new BThread(num));
Thread c=new Thread(new CThread(num));
a.start();
b.start();
c.start();
}
}
test result
"C:\Program Files\Java\jdk1.8.0_121\bin\java" "-javaagent:C:\Users\boonya\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.2.5\lib\idea_rt.jar=51911:C:\Users\boonya\AppData\Roaming\JetBrains\IntelliJ IDEA 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;C:\Users\boonya\Desktop\JavaAlgorithm\target\test-classes;C:\Users\boonya\Desktop\JavaAlgorithm\target\classes" com.boonya.thread.test.MainTest
AThread:1
BThread:2
AThread:3
BThread:4
AThread:5
BThread:6
AThread:7
BThread:8
AThread:9
BThread:10
AThread:11
BThread:12
AThread:13
BThread:14
AThread:15
BThread:16
AThread:17
BThread:18
AThread:19
BThread:20
CThread:success!
Process finished with exit code 0
Note: synchronized as a method block needs to lock only objects, not common data types.
AB Thread Improvement: Using Thread Waiting and Notification
AThread.java
package com.boonya.thread.test;
/**
* @ClassName: AThread
* @Description: TODO( Odd Threads )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 22:26
*/
public class AThread implements Runnable{
Num num;
public AThread(Num num){
this.num=num;
}
public void run() {
while (num.value<20){
synchronized (num){
if(num.value%2!=0){
System.out.println("AThread:"+ num.value);
num.value++;
//num.notify();
num.notifyAll();
}else{
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
BThread.java
package com.boonya.thread.test;
/**
* @ClassName: BThread
* @Description: TODO( Even Threads )
* @author: pengjunlin
* @motto: Learning requires perseverance, then show perseverance
* @date 2019-01-14 22:26
*/
public class BThread implements Runnable {
Num num;
public BThread(Num num){
this.num=num;
}
public void run() {
while (num.value<=20){
synchronized (num){
if(num.value%2==0){
System.out.println("BThread:"+ num.value);
num.value++;
//num.notify();
num.notifyAll();
}else{
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
Note: Thread wait and notification is one way to save the CPU operation and avoid CPU idling (thread method 1 is scary to keep running like a dead loop) and calling the thread's wait () if you want the thread to stop.