第一题编写一个多线程程序:
要求
1.创建两个线程 线程的名字分别为网店1 和网店2 主线程的线程名更改为 实体店
2.2个网店分别卖100个乒乓球每卖出一个打印正在卖出第几个, 实体店卖出10个
3.实体店一旦卖完其他两个网店就停止销售
package com.yang.day11.title01;
/**
* @author WangYang
* @version 1.0
* @create 2020-02-14 19:00
* <p>
* 要求
* 1.创建两个线程 线程的名字分别为网店1 和网店2 主线程的线程名更改为 实体店
* 2.2个网店分别卖100个乒乓球每卖出一个打印正在卖出第几个, 实体店卖出10个
* 3.实体店一旦卖完其他两个网店就停止销售
*/
public class OnlineStore implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "正在卖出第" + i+ "个");
}
}
}
class TestOnlineStore {
public static void main(String[] args) {
//主线程的线程名更改为 实体店
Thread.currentThread().setName("实体店:");
//创建两个线程 线程的名字分别为网店1 和网店2
OnlineStore os = new OnlineStore();
Thread t1 = new Thread(os, "网店1:");
Thread t2 = new Thread(os, "网店2:");
//设置t1 t2 线程为守护线程、
t1.setDaemon(true);
t2.setDaemon(true);
t1.start();
t2.start();
//主线程卖出10后,其他线程停止销售
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "正在卖出第" + (i+1) + "个");
}
}
}
第二题:分析以下需求,并用代码实现
一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为300毫秒,
要求:请用多线程模拟卖票过程并打印剩余电影票的数量
package com.yang.day11.title02;
/**
* @author WangYang
* @version 1.0
* @create 2020-02-14 20:32
*
* 一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为300毫秒,
* 要求:请用多线程模拟卖票过程并打印剩余电影票的数量
*/
public class SaleWindow implements Runnable{
//一共有1000张电影票
private int ticket = 1000;
@Override
public void run() {
while (true){
synchronized (this){ //此时锁对象就是SaleWindow对象
if(ticket > 0){
//假设每次领取的时间为300毫秒
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(Thread.currentThread().getName() + "卖出第" + ticket +"张票");
ticket--;
System.out.println(",剩余"+ticket+"张票");
}
}
}
}
}
class getTicket{
public static void main(String[] args) {
//在两个窗口领取
SaleWindow sw = new SaleWindow();
Thread w1 = new Thread(sw,"窗口1:");
Thread w2 = new Thread(sw,"窗口2:");
w1.start();
w2.start();
}
}
第三题:使用多线程解决以下问题
有一个包包的数量为100个。分别从实体店和官网进行售卖!
要求使用多线程的方式,分别打印实体店和官网卖出包包的信息!
分别统计官网和实体店各卖出了多少个包包,例如:
官网共卖出了45个
实体店共卖出了55个
package com.yang.day11.title03;
/**
* @author WangYang
* @version 1.0
* @create 2020-02-14 20:45
* <p>
* 有一个包包的数量为100个。分别从实体店和官网进行售卖!
* 要求使用多线程的方式,分别打印实体店和官网卖出包包的信息!
* 分别统计官网和实体店各卖出了多少个包包,例如:
* 官网共卖出了45个
* 实体店共卖出了55个
*/
public class Title3 implements Runnable {
//包包的数量为100个
private int total = 100;
//分别统计官网和实体店各卖出了多少个包包
private int net = 0;
private int shop = 0;
@Override
public void run() {
while (true) {
synchronized (this) {
if (total > 0) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
//售卖
total--;
if ("实体店".equals(Thread.currentThread().getName())) {
shop++;
} else {
net++;
}
} else {
if ("实体店".equals(Thread.currentThread().getName())) {
System.out.println("实体店共卖出了" + shop + "个");
break;
} else {
System.out.println("官网共卖出了" + net + "个");
break;
}
}
}
}
}
}
class TestDemo {
public static void main(String[] args) {
Title3 rn = new Title3();
//分别从实体店和官网进行售卖!
Thread net = new Thread(rn, "官网");
Thread shop = new Thread(rn, "实体店");
net.start();
shop.start();
}
}
解决面试题java两种线程,一个线程打印 1~52,另一个线程打印字母A-Z,打印顺序为12A34B56C……5152Z。
package com.yang.day11.title04;
import java.util.zip.CheckedOutputStream;
/**
* @author WangYang
* @version 1.0
* @create 2020-02-14 21:07
* <p>
* 解决面试题java两种线程,一个线程打印 1~52,另一个线程打印字母A-Z,打印顺序为12A34B56C……5152Z。
*/
public class Title04 {
public static void main(String[] args) {
Object obj = new Object();
//打印数字
new Thread() {
@Override
public void run() {
int count = 0;
synchronized (obj) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 1; i < 53; i++) {
System.out.print(i);
count++;
if (count >= 2) {
obj.notifyAll();
try {
obj.wait();
count = 0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}.start();
//打印字符
new Thread() {
@Override
public void run() {
int count = 0;
synchronized (obj) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 65; i < 91; i++) {
System.out.print((char) i);
count++;
if (count >= 1) {
obj.notifyAll();
try {
obj.wait();
count = 0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}.start();
}
}