Java线程

龟兔赛跑

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;
                }
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤永红

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值