龟兔赛跑
package com.hr;
//龟兔赛跑
public class Race implements Runnable {
/**
* 胜出者
*/
private static String winner;
@Override
public void run() {
//赛道
for (int step = 1; step <= 101; step++) {
//兔子休眠
if (Thread.currentThread().getName().equals("兔子") && step % 50 == 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver(step);
if (flag) {
break;
}
System.out.println(Thread.currentThread().getName() + "跑了" + step + "步");
}
}
//判断比赛是否结束
private boolean gameOver(int step) {
if (winner != null) { //如果存在胜利者
return true;
}
if (step >= 100) { //如果跑到了比赛结束
winner = Thread.currentThread().getName();
System.out.println("比赛结束");
System.out.println("胜利者----->" + winner);
return true;
}
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race, "兔子").start();
new Thread(race, "乌龟").start();
}
}
动态时间
package com.hr;
import javax.swing.*;
import java.awt.*;
import java.util.Calendar;
/**
* @Classname MyDateUtil
* @Description TODO
* @Date 2021/4/26 9:31
* @Created by 汤永红
*/
public final class MyDateUtil extends Thread {
JLabel lblDate;
public MyDateUtil(JLabel lblDate) {
this.lblDate = lblDate;
}
@Override
public void run() {
while (true) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int date = c.get(Calendar.DATE);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
//设置内容
lblDate.setText(year + "年" + month + "月" + date + "日" + hour + ":" + minute + ":" + second);
//设置字体
lblDate.setFont(new Font("楷体", Font.BOLD, 30));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.hr;
import javax.swing.*;
import java.awt.*;
import java.util.Date;
/**
* @Classname TestTime
* @Description TODO
* @Date 2021/4/26 9:08
* @Created by 汤永红
*/
public class TestTime extends JFrame {
private JLabel lblDate;
public TestTime() {
//设置标题
setTitle("时间走动");
//设置大小
setSize(400, 300);
//设置边界布局
setLayout(new BorderLayout());
//设置居中
setLocationRelativeTo(null);
//设置退出就关闭
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//获取日期和时期
lblDate = new JLabel();
//匿名内部类
new MyDateUtil(lblDate).start();
this.getContentPane().add(lblDate, BorderLayout.NORTH);
//设置可见
setVisible(true);
}
public static void main(String[] args) {
new TestTime();
}
}
卖火车票
package com.hr;
import sun.security.krb5.internal.Ticket;
/**
* @Classname TestTick
* @Description TODO
* @Date 2021/4/26 9:57
* @Created by 汤永红
*/
public class TestTick extends Thread {
String name;
//准备100张票
private static int tick = 100;
public TestTick(String name) {
this.name = name;
}
public static void main(String[] args) {
//五个窗口
new TestTick("窗口1").start();
new TestTick("窗口2").start();
new TestTick("窗口3").start();
new TestTick("窗口4").start();
}
@Override
public void run() {
try {
while (true) {
synchronized (Ticket.class) {
//卖光
if (tick <= 0) {
break;
}
Thread.sleep(1000);
System.out.println(this.name + "--这是第" + tick-- + "张票");
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
生产包子卖包子
package com.hr;
/**
* @Classname Test02
* @Description TODO
* @Date 2021/4/26 10:51
* @Created by 汤永红
*/
public class Test02 {
public static void main(String[] args) {
BaoZi bz = new BaoZi();
//创建包子铺线程,开始生产包子
new BaoZIPu(bz).start();
//创建吃货线程,开启,吃包子
new ChiHuo(bz).start();
}
}
class BaoZIPu extends Thread {
private BaoZi bz;
public BaoZIPu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
int count = 0;
while (true) {
//同步技术
synchronized (bz) {
//判断有没有包子
if (bz.isFlag()) {
//包子铺调用wait反法进入等待状态
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒之后执行,包子铺生产包子
//生产两种包子
if (count % 2 == 0) {
bz.setPi("薄皮");
bz.setXian("韮菜");
} else {
bz.setPi("厚皮");
bz.setXian("白菜");
}
count++;
System.out.println("包子铺正在生产" + bz.getPi() + bz.getXian() + "的包子" + (++BaoZi.number));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//包子铺生产好了包子
//修改包子的状态为true
bz.setFlag(true);
//唤醒吃货线程,让吃货线程吃包子
bz.notify();
System.out.println("包子铺已经生产:" + bz.getPi() + bz.getXian() + "的包子,吃货可以开始吃" + BaoZi.number);
if (BaoZi.number >= 50) {
return;
}
}
}
}
}
class BaoZi {
/**
* 皮
*/
private String pi;
/**
* 馅
*/
private String xian;
/**
* 包子的状态:有 true 没有 false,唤醒吃货线程,让吃货线程吃包子
*/
private boolean flag = false;
public static int number = 1;
public String getPi() {
return pi;
}
public void setPi(String pi) {
this.pi = pi;
}
public String getXian() {
return xian;
}
public void setXian(String xian) {
this.xian = xian;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
class ChiHuo extends Thread {
private BaoZi bz;
public ChiHuo(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
while (true) {
synchronized (bz) {
if (bz.isFlag() == false) {
try {
bz.wait();//等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒后执行的代码 ,吃包子
System.out.println("吃货正在吃" + bz.getPi() + bz.getXian() + "的包子");
bz.setFlag(false);
bz.notify();
System.out.println("吃货已经把" + bz.getPi() + bz.getXian() + "的包子吃完了,包子铺开始生产包子 ");
System.out.println("====================================================");
if (bz.getNumber() >= 50) {
return;
}
}
}
}
}