思路1:synchronized
public class ThreadTest {
int i =1;
boolean firstDone = false;
Object lock = new Object();
public static void main(String[] args) {
ThreadTest t =new ThreadTest();
t.print();
}
void print(){
Thread t1 = new Thread(new Runnable() {
public void run() {
for(;i<=100;)
{
synchronized (lock) {
if(!firstDone) {
System.out.println(Thread.currentThread().getName());
System.out.println(i++);
firstDone = true;
lock.notify();
}
else{
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
for(;i<=100;)
{
synchronized (lock) {
if(firstDone) {
System.out.println(Thread.currentThread().getName());
System.out.println(i++);
firstDone = false;
lock.notify();
}
else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
});
t1.start();
t2.start();
}
}
思路2:信号量Semaphore
import java.util.concurrent.Semaphore;
public class ThreadTest2 {
int i =1;
Semaphore s1 = new Semaphore(1);
Semaphore s2 = new Semaphore(0);
public static void main(String[] args) {
ThreadTest2 t = new ThreadTest2();
t.print();
}
void print(){
Thread t1 = new Thread(new Runnable() {
public void run() {
while(i<=100) {
try {
s1.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
System.out.println(i++);
s2.release();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
while(i<=100) {
try {
s2.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
System.out.println(i++);
s1.release();
}
}
});
t1.start();
t2.start();
}
}
思路3:ReentrantLock + Condition
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadTest3 {
int i =1;
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
boolean firstDone = false;
public static void main(String[] args) {
ThreadTest3 t = new ThreadTest3();
t.print();
}
void print(){
Thread t1 = new Thread(new Runnable() {
public void run() {
while (i <= 100) {
lock.lock();
if(!firstDone) {
System.out.println(Thread.currentThread().getName());
System.out.println(i);
i++;
firstDone = true;
condition2.signal();
}
else {
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.unlock();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
while (i <= 100) {
lock.lock();
if(firstDone) {
System.out.println(Thread.currentThread().getName());
System.out.println(i);
i++;
firstDone = false;
condition1.signal();
}
else {
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.unlock();
}
}
});
t1.start();
t2.start();
}
}