第一題編寫一個多線程程序:
要求
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();
}
}