一.使用synchronized关键字:
package test;
public class PrintABC implements Runnable{
private String name;
private int id;
private static int count=0;
public PrintABC(String name, int id) {
this.name = name;
this.id = id;
}
public static final Object obj=new Object();
@Override
public void run() {
synchronized (obj) {
while(count<30){
if(count % 3==id){
System.out.println(name+": "+count);
count++;
obj.notifyAll();
}else{
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
new Thread(new PrintABC("A",0)).start();
new Thread(new PrintABC("B",1)).start();
new Thread(new PrintABC("C",2)).start();
//System.out.println(2%3);
}
}
二.使用LOCK关键字.
package test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class day01 {
static int count=0;
public static void main(String[] args) {
final Lock lock=new ReentrantLock();
Thread a=new Thread(new Runnable(){
@Override
public void run() {
while(count<=29){
lock.lock();
//note:当count=29的时候,线程a,b都会被阻塞在lock()方法处,当c线程执行完unlock()时,count=30,如果不添加条件count<=29,a线程将多打印一次"A".
if(count%3==0&&count<=29){
System.out.println(count+":"+"A");
count++;
}
lock.unlock();
}
}
});
Thread b=new Thread(new Runnable(){
@Override
public void run() {
while(count<=29){
lock.lock();
if(count%3==1){
System.out.println(count+":"+"B");
count++;
}
lock.unlock();
}
}
});
Thread c=new Thread(new Runnable(){
@Override
public void run() {
while(count<=29){
lock.lock();
if(count%3==2){
System.out.println(count+":"+"C");
count++;
}
lock.unlock();
}
}
});
try {
a.start();
b.start();
c.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}