线程的使用和三种创建方式(带火车票实例)

本文详细介绍了Java中线程的三种创建方式:继承Thread类、实现Runnable接口和实现Callable接口,并通过模拟火车票售卖的实例进行实战演示,旨在帮助读者深入理解线程的使用。
摘要由CSDN通过智能技术生成

第一种 继承Thread类

public class ThreadDemo1 extends Thread{
    @Override
    public void run() {
        System.out.println("继承Thread来的run");
    }

    public static void main(String[] args) {
        ThreadDemo1 td1 = new ThreadDemo1();
        td1.start();//开启线程
        ThreadDemo1 td2 = new ThreadDemo1();
        td2.start();//开启线程
    }
}

第二种 实现Runnable接口

public class ThreadDemo2 implements Runnable{
    @Override
    public void run() {
        System.out.println("我是实现Runnable接口来的线程");
    }

    public static void main(String[] args) {
        ThreadDemo2 td1 = new ThreadDemo2();
        Thread th1 = new Thread(td1);//用Thread的Thread(Runnable target) 构造方法分配新的Thread对象来执行 strat方法 开启线程 
        th1.start();//开启线程
        ThreadDemo2 td2 = new ThreadDemo2();
        Thread th2 = new Thread(td1);
        th2.start();
    }
}

第三种 实现Callable接口

public class ThreadDemo4 implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int i = 0;
        for (; i < 20; i++) {
            //打印当前线程的名字Thread.currentThread().getName()
            System.out.println(Thread.currentThread().getName()+"   "+i);
        }
        return i;
    }

    public static void main(String[] args) {
        ThreadDemo4 td1 = new ThreadDemo4();
        //需要借助2个类开启线程
        FutureTask<Integer> ft = new FutureTask<>(td1);
        //线程池 ,管理 线程中任务调度的 .ExecutorService本身是线程池对象
        ExecutorService ser = Executors.newFixedThreadPool(2);//参数表示池中的线程数
        //将任务交给 线程池管理
        ser.submit(ft);
        try {
            Integer result = ft.get();//等待计算完成,然后检索其结果。 
            System.out.println(result);
            System.exit(0);//关闭jvm
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

使用实例(三个窗口买火车票)

/**
 * 三线程完成三个窗口 火车票购买
 */
public class LxTwo implements Runnable{
    static int num=20;//总共20张票
    static String zz="z";//给synchronized(同步)提供参数
    @Override
    public void run() {
         while (true){//死循环
             try {
                 Thread.sleep(2000);//每隔两秒 出一次票
                 synchronized (zz){
                     if (num>0){
                         System.out.println(Thread.currentThread().getName()+"购买成功!票号为"+num);
                         num--;
                     }else {
                         System.out.println("票没了老铁!");
                         System.exit(0);//退出JVM
                     }
                 }
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
        }
    }
    
    public static void main(String[] args) {
        LxTwo lo1 = new LxTwo();
        Thread td1 = new Thread(lo1);
        td1.start();

        LxTwo lo2 = new LxTwo();
        Thread td2 = new Thread(lo2);
        td2.start();

        LxTwo lo3 = new LxTwo();
        Thread td3 = new Thread(lo3);
        td3.start();
    }
}

在这里插入图片描述

写的不好勿喷 有问题欢迎大家来提 我们一起进步!加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值