使用synchronized和wait()、notify()实现
public class OddEvenprint {
private static volatile Integer number = 1;
private Object ob = new Object();
class Odd implements Runnable{
@Override
public void run() {
while (number<100){
synchronized (ob){
System.out.println("奇数"+number);
number++;
ob.notify();
try {
if (number<100) {
ob.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class Even implements Runnable{
@Override
public void run() {
while (number<=100){
synchronized (ob){
System.out.println("偶数"+number);
number++;
ob.notify();
try {
if (number<=100) {
ob.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
OddEvenprint oddEvenprint = new OddEvenprint();
Odd odd = oddEvenprint.new Odd();
Even even = oddEvenprint.new Even();
new Thread(odd).start();
new Thread(even).start();
}
}
下面这个代码是别人写的:
(找不到是看谁的了)
public class PrintSD {
//定义打印的方法
public synchronized void print(String str,int num){
notify();
System.out.println(str+num);
try {
if(100 != num){
wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//奇数打印线程
class Odd implements Runnable{
@Override
public void run() {
for(int i=1;i<100;i+=2){
print("奇数:",i);
}
}
}
//偶数打印线程
class Even implements Runnable{
@Override
public void run() {
for(int i=2;i<=100;i+=2){
print("偶数:",i);
}
}
}
public static void main(String[] args) {
PrintSD p = new PrintSD();
Odd odd = p.new Odd();
Even even = p.new Even();
new Thread(odd).start();
new Thread(even).start();
System.out.println("我结束了");
}
}
使用Lock实现
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class OddEvenPrintByLock {
private static volatile Integer number = 0;
Lock lock = new ReentrantLock();
Condition oddCondition = lock.newCondition();
Condition evenCondition = lock.newCondition();
class Odd implements Runnable{
@Override
public void run() {
while (number<100){
try {
lock.lock();
System.out.println("奇数"+number);
number++;
evenCondition.signal();
if (number<100) {
oddCondition.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
class Even implements Runnable{
@Override
public void run() {
while (number<=100){
try {
lock.lock();
System.out.println("偶数"+number);
number++;
oddCondition.signal();
if (number<=100) {
evenCondition.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
public static void main(String[] args) {
OddEvenPrintByLock print = new OddEvenPrintByLock();
Even even = print.new Even();
Odd odd = print.new Odd();
new Thread(even).start();
new Thread(odd).start();
}