练习一:售票
需求:一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒,
请用多线程模拟卖票过程并打印剩余电影票的数量
代码示例:
public class MyThread extends Thread {
//第一种方式实现多线程,测试类中MyThread会创建多次,所以需要加static
static int ticket = 1000;
@Override
public void run() {
//1.循环
while (true) {
//2.同步代码块
synchronized (MyThread.class) {
//3.判断共享数据(已经到末尾)
if (ticket == 0) {
break;
} else {
//4.判断共享数据(没有到末尾)
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket--;
System.out.println(getName() + "在卖票,还剩下" + ticket + "张票!!!");
}
}
}
}
}
public class Test {
public static void main(String[] args) {
/*
一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒,
要求:请用多线程模拟卖票过程并打印剩余电影票的数量
*/
//创建线程对象
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
//给线程设置名字
t1.setName("窗口1");
t2.setName("窗口2");
//开启线程
t1.start();
t2.start();
}
}
练习二:赠送礼物
需求:有100份礼品,两人同时发送,当剩下的礼品小于10份的时候则不再送出。
利用多线程模拟该过程并将线程的名字和礼物的剩余数量打印出来.
代码:
public class MyRunable implements Runnable {
//第二种方式实现多线程,测试类中MyRunable只创建一次,所以不需要加static
int count = 100;
@Override
public void run() {
//1.循环
while (true) {
//2.同步代码块
synchronized (MyThread.class) {
//3.判断共享数据(已经到末尾)
if (count < 10) {
System.out.println("礼物还剩下" + count + "不再赠送");
break;
} else {
//4.判断共享数据(没有到末尾)
count--;
System.out.println(Thread.currentThread().getName() + "在赠送礼物,还剩下" + count + "个礼物!!!");
}
}
}
}
}
public class Test {
public static void main(String[] args) {
/*
有100份礼品,两人同时发送,当剩下的礼品小于10份的时候则不再送出,
利用多线程模拟该过程并将线程的名字和礼物的剩余数量打印出来.
*/
//创建参数对象
MyRunable mr = new MyRunable();
//创建线程对象
Thread t1 = new Thread(mr,"窗口1");
Thread t2 = new Thread(mr,"窗口2");
//启动线程
t1.start();
t2.start();
}
}
练习三:打印数字
需求:同时开启两个线程,共同获取1-100之间的所有数字。将输出所有的奇数。
代码:
public class MyRunable implements Runnable {
//第二种方式实现多线程,测试类中MyRunable只创建一次,所以不需要加static
int number = 1;
@Override
public void run() {
//1.循环
while (true) {
//2.同步代码块
synchronized (MyThread.class) {
//3.判断共享数据(已经到末尾)
if (number > 100) {
break;
} else {
//4.判断共享数据(没有到末尾)
if(number % 2 == 1){
System.out.println(Thread.currentThread().getName() + "打印数字" + number);
}
number++;
}
}
}
}
}
public class Test {
public static void main(String[] args) {
/*
同时开启两个线程,共同获取1-100之间的所有