(java笔记整理)多线程售票

71 阅读2分钟

多线程售票

package cc;

public class www {
    public static void main(String[] args) {
        //测试 出现超时
//        SellTicket sellTicket = new SellTicket();
//        SellTicket sellTicket1 = new SellTicket();
//        SellTicket sellTicket2 = new SellTicket();
//        sellTicket.start();
//        sellTicket1.start();
//        sellTicket2.start();
        System.out.println("使用实现接口方式来售票");
        SellTicket02 sellTicket02 = new SellTicket02();
        new Thread(sellTicket02).start();
    }
}

//使用Thread方式
class SellTicket extends Thread {
    private static int tiketNum = 100;//让多个线程共享ticketNum

    @Override
    public void run() {
        while (true) {
            if (tiketNum <= 0) {
                System.out.println("售票结束");
                break;
            }
            try {//休眠50毫秒,模拟
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + (--tiketNum));
        }
    }
}

//实现接口方式
class SellTicket02 implements Runnable {
    private static int tiketNum = 100;

    @Override
    public void run() {
        while (true) {
            if (tiketNum <= 0) {
                System.out.println("售票结束");
                break;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + (--tiketNum));
        }
    }
}

通知方式

线程常用方法

public static void main(String[] args) throws InterruptedException {
        T t = new T();
        for (int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("hi" + i);
        }
        System.out.println(t.getName() + "线程的优先级" + t.getPriority());
        t.interrupt();//执行到这就会中断t线程的休眠
    }
class T extends Thread {
    @Override
    public void run() {
        while (true) {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + "jk" + i);
            }
            try {
                System.out.println(Thread.currentThread().getName());
                Thread.sleep(20000);//20秒
            } catch (InterruptedException e) {
                //当线程执行到一个Interrupt方法时,就会catch一个异常 可以加入自己的业务代码
                System.out.println(Thread.currentThread().getName());
            }
        }
    }
}

练习题

package cc;

public class www {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new T());//创建子线程
        //主线程
        for (int i = 1; i <= 10; i++) {
            System.out.println("hi" + i);
            if (i == 5) {//主线程输出了五次i
                t.start();//启动子线程输出hello
                t.join();//立即将子线程 插入到主线程main中 让t先执行
            }
            Thread.sleep(1000);//输出一次hi 休眠一次
        }
    }
}

//子线程
class T implements Runnable {
    private int count = 0;

    @Override
    public void run() {
        while (true) {
            System.out.println("hello" + (++count));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count == 10) {
                break;
            }
        }
    }
}

用户线程和守护线程

public class www {
    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        //如果希望main线程结束后 子线程自动结束
        //只需将子线程设为守护线程就行
        t.setDaemon(true);//先设置好再启动
        t.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("uyg");
            Thread.sleep(1000);
        }
    }
}

//子线程
class T extends Thread {
    @Override
    public void run() {
        for (; ; ) {//无限循环
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("uyjtgu");
        }
    }
}

线程状态转换

Synchronized 线程同步机制

解决上面售票超卖问题:

package cc;
public class www {
    public static void main(String[] args) {
        SellTicket03 sellTicket03 = new SellTicket03();
        new Thread(sellTicket03).start();
        new Thread(sellTicket03).start();
        new Thread(sellTicket03).start();
    }
}

//实现接口方式 使用synchronized实现线程同步
class SellTicket03 implements Runnable {
    private boolean loop = true;//控制run变量
    private static int tiketNum = 100;

    public synchronized void sell() {//同步方法 在同一时刻 只能有一个线程来执行sell()
        if (tiketNum <= 0) {
            System.out.println("售票结束");
            loop = false;
            return;
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + (--tiketNum));
    }

    @Override
    public void run() {
        while (loop) {
            sell(); //sell()是一个同步方法
        }
    }
}