互联网Java工程师面试题·Java 总结篇·第六弹

本文详细介绍了Java并发编程中的关键概念,包括TreeMap和TreeSet的排序原理、线程的sleep()、wait()、yield()方法的区别、线程同步与调度相关方法、多线程实现方式、synchronized关键字用法以及同步和异步的概念。还探讨了synchronized与java.util.concurrent.locks.Lock的异同,强调了线程池的重要性和线程状态转换。
摘要由CSDN通过智能技术生成

目录

56、TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?

57、Thread 类的 sleep()方法和对象的 wait()方法都可以让线程暂停执行,它们有什么区别?

58、线程的 sleep()方法和 yield()方法有什么区别?

59、当一个线程进入一个对象的 synchronized 方法 A 之后,其它线程是否可进入此对象的 synchronized 方法 B?

60、请说出与线程同步以及线程调度相关的方法。

61、编写多线程程序有几种实现方式?

62、synchronized 关键字的用法?

63、举例说明同步和异步。

64、启动一个线程是调用 run()还是 start()方法?

65、什么是线程池(thread pool)?

66、线程的基本状态以及状态之间的关系?

67、简述 synchronized 和 java.util.concurrent.locks.Lock的异同?


56、TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?

TreeSet 要求存放的对象所属的类必须实现 Comparable 接口,该接口提供了比较元素的 compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进 行排 序。Collections 工具类的 sort 方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator 接口的子类型(需要重写 compare 方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java 中对函数式编程的支持)。

例子 1:

public class Student implements Comparable<Student> {
    private String name;// 姓名
    private int age;// 年龄
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

@Override
public String toString() {
    return "Student [name=" + name + ", age=" + age + "]";
}

@Override
public int compareTo(Student o) {
    return this.age - o.age; // 比较年龄(年龄的升序)
}
}
import java.util.Set;
import java.util.TreeSet;
class Test01 {
    public static void main(String[] args) {
        Set<Student> set = new TreeSet<>();// Java 7 的钻石语法
(构造器后面的尖括号中不需要写类型)
        set.add(new Student("Hao LUO", 33));
        set.add(new Student("XJ WANG", 32));
        set.add(new Student("Bruce LEE", 60));
        set.add(new Student("Bob YANG", 22));

        for(Student stu : set) {
            System.out.println(stu);
        }
//输出结果:
//Student [name=Bob YANG, age=22]
//Student [name=XJ WANG, age=32]
//Student [name=Hao LUO, age=33]
//Student [name=Bruce LEE, age=60]
    }
}

例子2:

public class Student {
    private String name; // 姓名
    private int age; // 年龄
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
}
/*** 获取学生姓名 ***/
public String getName() {
    return name;
}
/*** 获取学生年龄***/
public int getAge() {
    return age;
}
@Override
public String toString() {
    return "Student [name=" + name + ", age=" + age + "]";
    }
}

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Test02 {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();// Java 7 的钻石语法
(构造器后面的尖括号中不需要写类型)
        list.add(new Student("Hao LUO", 33));
        list.add(new Student("XJ WANG", 32));
        list.add(new Student("Bruce LEE", 60));
        list.add(new Student("Bob YANG", 22));
// 通过 sort 方法的第二个参数传入一个 Comparator 接口对象
//相当于是传入一个比较对象大小的算法到 sort 方法中
//由于 Java 中没有函数指针、仿函数、委托这样的概念
//因此要将一个算法传入一个方法中唯一的选择就是通过接口回调
    Collections.sort(list, new Comparator<Student> () {
    @Override
        public int compare(Student o1, Student o2) {
        return o1.getName().compareTo(o2.getName()); //比较学生姓名
        }
    });
    for(Student stu : list) {
        System.out.println(stu);
    }
//输出结果:
//Student [name=Bob YANG, age=22]
//Student [name=Bruce LEE, age=60]
//Student [name=Hao LUO, age=33]
//Student [name=XJ WANG, age=32]
    }
}

57、Thread 类的 sleep()方法和对象的 wait()方法都可以让线程暂停执行,它们有什么区别?

        sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第 66 题中的线程状态转换图)。wait()是 Object 类的方法,调用对象的 wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的 notify()方法(或 notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

补充:可能不少人对什么是进程,什么是线程还比较模糊,对于为什么需要多线程编程也不是特别理解。简单的说:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是 CPU 调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元,而线程之间可以共享内存。使用多线

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光の尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值