Java 多线程Thread和Runnable

Thread:

复制代码
class MyThread extends Thread
{
    private int ticketsCont=5; //一共有5张火车票

    private String name; //窗口, 也即是线程的名字

    public MyThread(String name){
        this.name=name;
    }

    @Override
    public void run(){

        while(ticketsCont>0){
            ticketsCont--; //如果还有票,就卖掉一张票
            System.out.println(name+"卖掉了1张票,剩余票数为:"+ticketsCont);
        }

    }
}

public class TicketsThread
{
    public static void main(String args[]){

        //创建三个线程,模拟三个窗口卖票
        MyThread mt1=new MyThread("窗口1");
        MyThread mt2=new MyThread("窗口2");
        MyThread mt3=new MyThread("窗口3");

        //启动三个线程,也即是窗口,开始卖票
        mt1.start();
        mt2.start();
        mt3.start();

    }
}
复制代码
复制代码
窗口1卖掉了1张票,剩余票数为:4
窗口1卖掉了1张票,剩余票数为:3
窗口1卖掉了1张票,剩余票数为:2
窗口1卖掉了1张票,剩余票数为:1
窗口1卖掉了1张票,剩余票数为:0
窗口3卖掉了1张票,剩余票数为:4
窗口2卖掉了1张票,剩余票数为:4
窗口3卖掉了1张票,剩余票数为:3
窗口3卖掉了1张票,剩余票数为:2
窗口3卖掉了1张票,剩余票数为:1
窗口3卖掉了1张票,剩余票数为:0
窗口2卖掉了1张票,剩余票数为:3
窗口2卖掉了1张票,剩余票数为:2
窗口2卖掉了1张票,剩余票数为:1
窗口2卖掉了1张票,剩余票数为:0
View Code
复制代码

Runnable接口:

复制代码
class MyThread2 implements Runnable
{
    private int ticketsCont=5; //一共有5张火车票

    @Override
    public void run(){
        while(true){
            synchronized(this){
                if(ticketsCont<=0){
                    break;
                }
                ticketsCont--; //如果还有票,就卖掉一张票

                System.out.println(Thread.currentThread().getName()+"卖掉了1张票,剩余票数为:"+ticketsCont);

                    /*try{
                        Thread.sleep(50);  //通过阻塞程序来查看效果
                    }
                    catch(Exception e){
                        System.out.println(e);
                    }*/
            }
        }

    }
}

public class TicketsRunnable
{
    public static void main(String args[]){

        MyThread2 mt=new MyThread2();
        //创建三个线程来模拟三个售票窗口
        Thread th1=new Thread(mt,"窗口1");
        Thread th2=new Thread(mt,"窗口2");
        Thread th3=new Thread(mt,"窗口3");

        //启动三个线程,也即是三个窗口,开始卖票
        th1.start();
        th2.start();
        th3.start();
    }
}
复制代码
复制代码
窗口1卖掉了1张票,剩余票数为:4
窗口1卖掉了1张票,剩余票数为:3
窗口1卖掉了1张票,剩余票数为:2
窗口1卖掉了1张票,剩余票数为:1
窗口1卖掉了1张票,剩余票数为:0
View Code
复制代码

修改MyThread2

复制代码
class MyThread2 implements Runnable
{
    private int ticketsCont=5; //一共有5张火车票
    @Override
    public void run() {
        while (true) {
            if (ticketsCont <= 0) {
                break;
            }
            ticketsCont--; //如果还有票,就卖掉一张票
            System.out.println(Thread.currentThread().getName() + "卖掉了1张票,剩余票数为:" + ticketsCont);
        }
    }
}
复制代码
复制代码
窗口1卖掉了1张票,剩余票数为:3
窗口3卖掉了1张票,剩余票数为:2
窗口2卖掉了1张票,剩余票数为:3
窗口3卖掉了1张票,剩余票数为:0
窗口1卖掉了1张票,剩余票数为:1
View Code
复制代码

Thread类是多个线程分别完成自己的任务,Runnable是多个线程共同完成一个任务。

建议使用Runnable这种方式创建线程。 程序中的同一资源指的是同一个Runnable对象。安全的卖票程序中需要加入同步synchronized。

 

http://www.cnblogs.com/Li-Cheng/p/4332179.html

posted @   hongdada  阅读(272)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示