1、编码:使用两个线程,分别打印1~100之间的奇数、偶数(实现奇数和偶数的交替打印)
public class PrintNumber {
//打印数值
public synchronized static void printNumber(int num){
//静态方法的同步锁:类名.class
try {
PrintNumber.class.notify();//唤醒当前对象锁下的任意一个线程
System.out.println(Thread.currentThread().getName()+" : "+num);
PrintNumber.class.wait();//释放掉锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//创建线程对象(负责打印奇数)
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=100;i+=2){
printNumber(i);
}
}
},"打印奇数");
t1.start();//启动线程
//创建线程对象(负责打印偶数)
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=2;i<=100;i+=2){
printNumber(i);
}
}
},"打印偶数");
t2.start();//启动线程
}
}
打印结果:
奇数线程:1
奇数线程线程正在等待
偶数线程:2
偶数线程线程正在等待
奇数线程:3
奇数线程线程正在等待
偶数线程:4
偶数线程线程正在等待
奇数线程:5
奇数线程线程正在等待
偶数线程:6
偶数线程线程正在等待
奇数线程:7
奇数线程线程正在等待
偶数线程:8
偶数线程线程正在等待
奇数线程:9
奇数线程线程正在等待
偶数线程:10
此时偶数线程线程数字已经大于100了
此时奇数线程线程数字已经大于100了
Process finished with exit code 0
2、用两个线程玩猜数字游戏。
第一个线程负责随机给出1~100之间的一个整数,第二个线程负责猜出这个数。要求每当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”、“猜大了”或“猜对了”。
猜数之前,要求第二个线程要等待第一个线程设置好要猜测的数。第一个线程设置好猜测数之后,两个线程还要相互等待,其原则是:第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后,等待给第二个线程给出猜测,如此进行,直到第二个线程给出正确的猜测后,两个线程进入死亡状态。
//共享资源代码:
public class NumberGame {
private int randomNumber;//随机数字
private int guessNumber;//猜的数字
//猜的结果 (初始值1000表示还没有随机数字)
private int guessResult=1000;// 0表示猜对了,1表示猜大了,-1表示猜小了
public int getGuessResult() {
return guessResult;
}
public void setGuessResult(int guessResult) {
this.guessResult = guessResult;
}
public int getRandomNumber() {
return randomNumber;
}
public void setRandomNumber(int randomNumber) {
this.randomNumber = randomNumber;
}
public int getGuessNumber() {
return guessNumber;
}
public void setGuessNumber(int guessNumber) {
this.guessNumber = guessNumber;
}
}
//给随机数字的线程任务代码:
public class GiveNumber implements Runnable {
public NumberGame numberGame = null;//共享资源
public GiveNumber(NumberGame numberGame) {
this.numberGame = numberGame;
}
@Override
public void run() {
for (int i = 1; ; i++) {
if (i == 1) {
//先获取一个随机数字
int rn = (int) (Math.random() * 100) + 1;
numberGame.setRandomNumber(rn);//把随机数值,存储到共享资源对象中
System.out.println("给你一个随机数字" + rn + "让你猜");
} else {
if (numberGame.getGuessNumber() > numberGame.getRandomNumber()) {
System.out.println("猜大了");
numberGame.setGuessResult(1);//设置猜数的结果
} else if (numberGame.getGuessNumber() < numberGame.getRandomNumber()) {
System.out.println("猜小了");
numberGame.setGuessResult(-1);
} else {
System.out.println("恭喜你,猜对了!");
numberGame.setGuessResult(0);
break;//结束循环
}
}
//暂缓一下(让GuessNumber线程执行:猜数字)
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//猜数字的线程任务代码:
public class GuessNumber implements Runnable {
public NumberGame numberGame = null;//共享资源
public GuessNumber(NumberGame numberGame) {
this.numberGame = numberGame;
}
@Override
public void run() {
//如果还没有随机数字,就暂缓。(先出随机数字)
if (numberGame.getGuessResult() == 1000) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int number = 0;
int min = 0;
int max = 100;
//一直猜数字。直到猜对了,循环才停止
for (int i = 1; ; i++) {
//第一次猜数字
if (i == 1) {
number = (min + max) / 2;
System.out.println("第" + i + "次猜:" + number);
numberGame.setGuessNumber(number);
} else {
//判断猜的结果
if (numberGame.getGuessResult() == 1) {//猜大了
//从min开始到之前猜的值之间,再猜一个
max = number;//之前猜的值
number = (min + max) / 2;
System.out.println("第" + i + "次猜:" + number);
numberGame.setGuessNumber(number);
} else if (numberGame.getGuessResult() == -1) {//猜小了
//从之前猜的值到max之间,再猜一个
min = number;//之前猜的值
number = (min+max)/2;
System.out.println("第" + i + "次猜:" + number);
numberGame.setGuessNumber(number);
} else {//猜对了
System.out.println("哈哈,猜对了!");
break;//结束循环
}
}
//暂缓一下(为了让GiveNumber线程执行)
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//测试类:
public class Game {
public static void main(String[] args) {
NumberGame numberGame = new NumberGame();
//创建GiveNumber线程任务 (把共享资源作为参数传递)
GiveNumber giveNumber= new GiveNumber(numberGame);
//创建GuessNumber线程任务
GuessNumber guessNumber =new GuessNumber(numberGame);
new Thread(giveNumber,"Give").start();
new Thread(guessNumber,"Guess").start();
}
}
打印结果:
发牌线程给你一个随机数字4让你猜
猜牌线程第1次猜:5
猜大了
猜牌线程第2次猜:2
猜小了
第3次猜:3
猜小了
第4次猜:4
恭喜你,猜对了!
哈哈,猜对了!
Process finished with exit code 0