Java复习打卡day21

线程池

线程池概述

为什么会出现线程池的概念?
其实现场呢个执行任务的阶段分为四个步骤:
    1.创建线程
    2.创建任务
    3.执行任务
    4.结束线程
而,在这四个步骤中,真正起作用的是中间的两个,但是他们所消耗的时间却只占了总时间的5%,
所以有大量的时间被创建线程和结束线程占用了,当线程的数量增多时,这样的无用时间浪费只会降低程序的性能
所以就有了线程池的概念。

什么是线程池?
顾名思义,就是线程的池子,装线程的容器。线程池里面有很多的线程,等待这被调用,而且被调用完之后,这些线程又会变成空闲的状态,
等待着下一次的调用。所以当使用线程池的时候,通常程序不会立马结束(线程在等待着再次调用),要等一会才会结束。

有哪些线程池呢?
线程池分为四类:
定长线程池、缓存线程池(又叫不定长线程池)、单线程线程池、周期性定长线程池。
=================================================================
下面就让我来一一介绍各类线程池的创建和使用方法吧!

定长线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo1 {
    public static void main(String[] args) {
        //定长线程池
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() +"锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
    }
}

缓存线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo {
    public static void main(String[] args) {
        //缓存线程池
        ExecutorService service = Executors.newCachedThreadPool();
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        } );
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        } );
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        } );
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        } );
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        } );
        service.execute(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        } );
    }
}

单线程线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo2 {
    public static void main(String[] args) {
        //单线程线程池
        ExecutorService service = Executors.newSingleThreadExecutor();
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
    }
}

周期性定长线程池

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Demo3 {
    public static void main(String[] args) {
        //周期性定长线程池
        ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
        /*
         定时执行一次:
        参数1.定时执行的任务
        参数2.定时时长
        参数3.定时的时长的单位,会用到TimeUnit枚举类
        * */
        /*service.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        },1, TimeUnit.SECONDS);*/
        /*
        周期定长循环
        参数1.循环执行任务
        参数2.初始延迟时间(第一次执行是在多久之后)
        参数3.周期延迟时间(每隔多久执行一次)
        参数4. 时长单位(TimeUnit)
        * */
        service.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("锄禾日当午,汗滴禾下土");
            }
        },3,3,TimeUnit.SECONDS);
    }
}

Lambda表达式

public class Demo4 {
    public static void main(String[] args) {
        //Lambda表达式
      /*  new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("床前明月光");
            }
        }).start();
        这段代码是用Runnable打印这段话的最简单方法,但是却有点复杂晦涩
        */
        new Thread(() -> System.out.println("床前明月光")).start();
        //这便是lambda表达式
    }
}

网络编程概述

网络编程

什么是计算机网络?
分布在不同区域的计算机,通过硬件等网络设备使用通信线路连接形成一个网格系统。
什么是IP地址?域名?
    IP是计算机在网络中的唯一标识,就像人在社会上的身份证号码一样;
    本机IP:
        127.0.0.1;
        localhost。
域名:
    简而言之就是IP地址的别名,更方便记忆,当访问域名(例如:www.baidu.com)时,计算机会先访问域名解析商,获得IP,再进行访问。
什么是端口号?
    端口号的范围是0~65535之间

    和IP一样,IP地址是计算机在网络中的唯一标识;
    端口号是计算机上的程序的唯一标识,用来区分不同应用程序的。
    端口号在使用的时候应当尽量避免1-1024之间,应为已经被知名软件和Windows的操作系统所占用。
什么是计算机之间的通信协议?
    通信协议就是计算机之间交流的标准。是对信息传递速度、出错控制、传入接口、步骤控制的一系列标准。
    常用的通信协议:http协议:超文本传输协议,80端口号
                 https协议:安全的超文本传输协议,443端口号
                 ftp协议:文件传输协议,21端口号
                 TCP协议:传输控制协议
                 UDP协议:数据报协议
网络编程的分类:
    b/s:浏览器服务端协议
    c/s:客户端服务端协议
TCP协议-OSI网络模型
    指的是从一台计算机的软件中将数据传输到另一台计算机的软件中的过程。
    七层网络模型:应用层/表现层/会话层/传输层/网络层/数据链接层/物理层
三次握手和四次挥手:tcp协议在操作客户端和服务端的时候,存在三次握手,确保数据的准确无误的传输,
                在断开连接的时候存在四次挥手的操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java员工打卡签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打卡签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法进行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法进行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值