请利用线程间通信, 完成连续打印1-100的数字, 要求一条线程专门打印奇数,另外一条专门用来打印偶数
要求:
1:数字打印必须是有序的,既1–100的顺序不能乱;
2:必须使用多线程技术;
效果:
…
参考答案:
public class A {
public static int number = 1;
public static void main(String[] args) {
Object lock = new Object();
//第一个线程专门负责打印偶数
new Thread(()->{
while (true) {
synchronized (lock) {
lock.notify();//唤醒对方;(注意,即使对方醒了也无法立刻进入synchronized包裹的代码)
//如果是奇数, 该条线程等待
if(number%2 == 1){
try {
lock.wait();//等待的时候,会释放锁,那么对方就可以执行了
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("第1条线程打印偶数:" + number);
number++;
if (number == 101) {
// 这个是打印偶数的线程,如果++后101就结束循环
//如果数字大于等于100就应该停止循环
break;
}
}
}
}
}).start();
//第2个线程专门负责打印奇数,
new Thread(()->{
while (true) {
synchronized (lock) {
lock.notify();//唤醒对方;(注意,即使对方醒了也无法立刻进入synchronized包裹的代码)
//如果是偶数, 该条线程等待
if(number%2 == 0){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("第2条线程打印奇数:" + number);
number++;
if (number == 100) {
break;
}
}
}
}
}).start();
}
}
假如某班级有10人,早晨老师来到教室之后,需要等待10位学生都到齐了才会开始上课,如果10位学生还没有到齐,老师需要一直等待;假如把老师和每一个学生都看成是一个独立的线程,请使用代码模拟这个老师上课的场景;
要求:
1:老师上课之前,打印老师准备就绪,等所有学生到齐之后,老师打印开始讲课;
2:只有10个学生都到了,老师才可以上课;
效果:
参考答案:
public class A {
public static void main(String[] args) {
CountDownLatch c = new CountDownLatch(10);
Teacher t = new Teacher(c);
new Thread(t, "张老师").start();
for (int i = 1; i <= 10; i++) {
Student s = new Student(c);
new Thread(s, "学生" + i).start();
}
}
}
class Teacher implements Runnable {
private CountDownLatch c;
public Teacher(CountDownLatch c) {
this.c = c;
}
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "已经准备好讲课了,正在等待同学们到齐...");
c.await();
System.out.println(Thread.currentThread().getName() + "开始讲java多线程了...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Student implements Runnable {
private CountDownLatch c;
public Student(CountDownLatch c) {
this.c = c;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "到了...");
c.countDown();
}
}
假如现在有一辆公交车,车上有两个乘务员,一个专门负责让乘客上车,并提示目前车上的人数,另一个乘务员专门负责乘客下车,并提示乘客下车后,目前车上的人数,请使用代码模拟这个场景;
要求:
1:公交车最多乘坐30位乘客,如果超过30人,则上车的乘务员不再安排乘客上车,会一直等待,直到车上有空位子再安排乘客上车;
2:如果车上乘客数量为0了,则不再乘客下车,直到车上有乘客,再继续安排乘客下车;
3:每次上下车的人数采用随机数的方式表示上车的人数和下车的人数,且上车时,1次最多上当前最大空余座位数,最少是1人,下车时,1次最多下当前车上总乘客数,最少是1人;
效果:
参考答案:
public class Demo3 {
public static void main(String[] args) {
Bus bus = new Bus();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
bus.getOn();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
bus.getOff();
}
}
}).start();
}
}
class Bus {
//车上最多有30个人
private int count = 0;
//上车的方法
public void getOn() {
synchronized (this) {
// 够30个就得等
if (count >= 30) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//一次上多个
Random random = new Random();
int number = random.nextInt(30 - count) + 1;
count += number;
System.out.println("上去了" + number + "个人,现在车上有" + count);
// 叫醒下车线程
this.notify();
}
}
//下车的方法
public void getOff() {
synchronized (this) {
if (count <= 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//0的时候就得等
// count--;
Random random = new Random();
int number = random.nextInt(count) + 1;
count -= number;
System.out.println("下去了" + number + "个人,现在车上有" + count);
//叫醒上车线程
this.notify();
}
}
}