面试题30天打卡-day14

1、线程的生命周期是什么,线程有几种状态,什么是上下文切换?

image-20230305101810104

线程通常有五种状态:创建,就绪,运行、阻塞和死亡状态。

  1. 新建状态(New):新创建了一个线程对象。
  2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
  5. 死亡状态(Dead):线程执行完了或者因异常退出了run方法,该线程结束生命周期。

其中阻塞的情况又分为三种:
(1)、等待阻塞:运行的线程执行wait方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify或notifyAll方法才能被唤醒,wait是object类的方法

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

(3)、其他阻塞:运行的线程执行sleep或join方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep状态超时、join等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。sleep是Thread类的方法。

2、什么是网关,网关有哪些作用?

网关英文名称为Gateway,又称网间连接器、协议转换器。它可以连接两个或者多个不同的网络,从而实现网络之间的通信和数据交换。网关通常具有路由、协议转换、安全控制、流量控制等多种功能。

网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器,与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。

网关的作用主要包括以下几个方面:

  1. 路由转发:网关可以根据不同的目的地址,将数据包转发到不同的目标网络或者主机。
  2. 协议转换:不同的网络可能采用不同的协议,网关可以实现不同协议之间的转换,从而实现不同网络之间的互通。
  3. 安全控制:网关可以实现安全控制,如访问控制、数据加密、防火墙等,保障网络的安全。
  4. 流量控制:网关可以对网络流量进行控制和限制,避免网络拥堵和资源浪费。
  5. 缓存和负载均衡:网关可以缓存数据,提高数据访问速度,同时也可以实现负载均衡,分摊服务器负载。

网关可以实现不同网络之间的互通互联,保障网络的安全和稳定。常用的网关包括路由器、网络服务器、防火墙、负载均衡等。

3、如何使用 Redis 实现一个排行榜?

使用 Redis 的 Zset 数据结构实现排行榜可以分为以下几个步骤:

  1. 连接 Redis 数据库:使用 Redis 客户端连接到 Redis 数据库。
  2. 创建排行榜:使用 Redis 的 Zadd 命令创建一个有序集合作为排行榜。
  3. 添加成员:使用 Redis 的 Zadd 命令向排行榜中添加成员,每个成员对应一个分值。
  4. 获取排行榜:使用 Redis 的 Zrevrange 命令获取排行榜中的成员,按照分值从高到低排序。
  5. 获取成员排名:使用 Redis 的 Zrevrank 命令获取某个成员在排行榜中的排名。
  6. 更新成员分值:使用 Redis 的 Zadd 命令更新某个成员的分值。
  7. 删除成员:使用 Redis 的 Zrem 命令删除某个成员。
import org.redisson.Redisson;
import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;

public class RedisRanking {
    
    

    private static RedissonClient redissonClient;

    // 初始化 Redisson 客户端
    static {
    
    
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://localhost:6379")
                .setDatabase(0);
        redissonClient = Redisson.create(config);
    }

    // 添加成员到排行榜
    public static void addMember(String member, double score) {
    
    
        RScoredSortedSet<String> ranking = redissonClient.getScoredSortedSet("ranking", StringCodec.INSTANCE);
        ranking.add(score, member);
    }

    // 获取排行榜
    public static void getRanking() {
    
    
        RScoredSortedSet<String> ranking = redissonClient.getScoredSortedSet("ranking", StringCodec.INSTANCE);
        int rank = 1;
        for (String member : ranking.descendingIterator()) {
    
    
            double score = ranking.getScore(member);
            System.out.printf("%d\t%s\t%f\n", rank++, member, score);
        }
    }

    // 获取成员排名
    public static void getRank(String member) {
    
    
        RScoredSortedSet<String> ranking = redissonClient.getScoredSortedSet("ranking", StringCodec.INSTANCE);
        long rank = ranking.revRank(member);
        double score = ranking.getScore(member);
        System.out.printf("%s\t%d\t%f\n", member, rank + 1, score);
    }

    // 更新成员分值
    public static void updateScore(String member, double score) {
    
    
        RScoredSortedSet<String> ranking = redissonClient.getScoredSortedSet("ranking", StringCodec.INSTANCE);
        ranking.addScore(member, score);
    }

    // 删除成员
    public static void removeMember(String member) {
    
    
        RScoredSortedSet<String> ranking = redissonClient.getScoredSortedSet("ranking", StringCodec.INSTANCE);
        ranking.remove(member);
    }

    // 关闭 Redisson 客户端
    public static void close() {
    
    
        redissonClient.shutdown();
    }

    // 测试
    public static void main(String[] args) {
    
    
        addMember("Tom", 90);
        addMember("Jack", 80);
        addMember("Lily", 95);
        addMember("Lucy", 85);
        getRanking();
        getRank("Tom");
        updateScore("Tom", 95);
        removeMember("Lucy");
        getRanking();
        close();
    }
}

我们首先使用 Redisson 客户端初始化 Redis 连接,然后定义了几个操作排行榜的方法,包括添加成员、获取排行榜、获取成员排名、更新成员分值和删除成员。这些方法分别对应了 Redisson 的 RScoredSortedSet 接口的不同方法,使用 Redisson 提供的方法可以非常方便地操作 Redis 有序集合。

在测试代码中,我们添加了几个成员到排行榜中,并测试了获取排行榜、获取成员排名

了 Redisson 的 RScoredSortedSet 接口的不同方法,使用 Redisson 提供的方法可以非常方便地操作 Redis 有序集合。

在测试代码中,我们添加了几个成员到排行榜中,并测试了获取排行榜、获取成员排名

猜你喜欢

转载自blog.csdn.net/qq_56098191/article/details/130411257