Java多线程 | 用多个线程模拟实现银行叫号系统

目录

Java多线程(一)

线程和进程

概念

区别

线程的3种创建方式

线程的启动

模拟实现银行叫号系统


 


Java多线程(一)

线程和进程

概念

进程:进程是指在系统中独立运行的一段程序,是资源(内存、CPU)分配的最小单位打开电脑上的任务管理器,比如QQ,IDEA等,一个应用就可以称之为一个进程

线程:线程是指进程中的某一个任务,线程是程序执行的最小单位,比如QQ的发送消息或者接收消息就是指一个线程。一般来说,进程是由多个线程组成的,线程也可以看作是一个最小的进程。

区别

  1. 进程是资源分配的最小单位,线程是程序执行的最小单位;
  2. 进程有自己独立的地址空间,每启动一个进程,系统就会给进程分配独立的资源,而线程是共享该进程中的资源的;
  3. 进程间的通信比较复杂,而线程之间因为资源共享,所以线程间通信更方便;
  4. 多进程的程序比多线程的程序更加健壮,比如一个线程死掉,就可能会影响该进程下的其他线程,但是进程的资源是单独分配的,所以一个进程死掉不会影响其他进程;
  5. 在JVM中,栈和方法区属于进程的空间,而堆和程序计数器属于线程的空间;
  6. 在应用场景方面:如果程序需要频繁的创建和销毁的话,更适合使用多线程实现,因为多进程的话要话要不停的分配资源,就会对系统来说,开销比较大;而如果更追求程序的安全性的话,更适合用多进程来实现。

线程的3种创建方式

1. 继承Thread类

class Threadone extends Thread {
    @Override
    public void run() {
        System.out.println("thread1 extend Thread...");
    }
}

2. 实现implement接口

class Thread2 implements Runnable {
    @Override
    public void run() {
        System.out.println("thread2 implements Runnable...");
    }
}

3. 通过匿名内部类

Thread t = new Thread(){
    @Override
    public void run(){
        System.out.println("通过匿名内部类实现的thread...");
    }
}

线程的启动

  • 通过start()方法启动线程
  • run()方法只是thread下的一个普通方法,在主线程里执行

模拟实现银行叫号系统

  1. 要求:假设有银行有4个窗口,用多线程实现4个窗口按照1到10的顺序叫1~10号的号码,4个窗口叫的10个号没有遗漏。
  2. 实现代码:
class bankSystemOne extends Thread {
    private String name;
    private static final int max = 10;//最大号码到10
    private static int number = 1;// 当前叫到的号码

    public bankSystemOne(String name){
        this.name = name;
    }
    @Override
    public void run() {
        while(number <= max) {
            System.out.println(name + "窗口: " + number++);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Test {
    public static void main(String[] args){
        bankSystemOne window1 = new bankSystemOne("一号");
        window1.start();

        bankSystemOne window2 = new bankSystemOne("二号");
        window2.start();

        bankSystemOne window3 = new bankSystemOne("三号");
        window3.start();

        bankSystemOne window4 = new bankSystemOne("四号");
        window4.start();
    }
}

运行结果:

与上面同理:通过实现接口的方法实现如下

class bankSystemTwo implements Runnable {
    private static final int max = 10;//最大的号码
    private static int num = 1;//当前叫到的号码

    @Override
    public void run() {
        for(int i = num;i <= max;i = num){
            System.out.println(Thread.currentThread().getName() + num++);
            try {
                Thread.sleep(15);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

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

        bankSystemTwo bank = new bankSystemTwo();

        Thread windowOne = new Thread(bank,"一号窗口: ");
        windowOne.start();

        Thread windowTwo = new Thread(bank,"二号窗口: ");
        windowTwo.start();

        Thread windowThree = new Thread(bank,"三号窗口: ");
        windowThree.start();

        Thread windowFour = new Thread(bank,"四号窗口: ");
        windowFour.start();

    }
}

运行结果:

注:如上仅个人理解所写,如有错误请批评指正,谢谢~

发布了45 篇原创文章 · 获赞 11 · 访问量 4821

猜你喜欢

转载自blog.csdn.net/weixin_44187963/article/details/103459524