本文共 4525 字,大约阅读时间需要 15 分钟。
程序是由一组指令组成的静态代码集合。一个进程是指运行中执行的程序的一次执行过程,系统为每个进程分配独立的内存区域。线程是进程的一部分,作为程序的执行路径,每个线程具有独立的运行栈和程序计数器。
并行:多个CPU同时处理多个任务。例如:多个人同时做不同的事。并发:同一CPU通过时间片轮流处理多个任务。例如:秒杀、多个人做同一件事。
方式一:继承 Thread类
方式二:实现 Runnable接口
两者对比:
start(): 启动当前线程 run(): 内部逻辑 currentThread(): 获取当前线程 getName(): 获取线程名称 setName(): 设置线程名称 yield(): 释放 CPU执行权 join(): 等待线程完成 sleep(): 线程睡眠
线程优先级: MAX_PRIORITY: 10(最高优先级) MIN_PRIORITY: 1(最低优先级) NORM_PRIORITY: 5(默认优先级)
线程生命周期 线程在运行过程中会经历多个状态,常见状态有:未启动、运行、阻塞、等待、终止。线程可以通过 currentState 判断当前状态。
线程同步 解决线程共享数据问题。方式一:同步代码块 synchronized(锁){ // 共享数据操作 }
方式二:同步方法 public synchronized void doSomeThing(){} // 可能是 instance lock,或者 class lock
线程通信 wait()、notify()、notifyAll() 方法只能在同步代码块中调用,否则会抛出 IllegalMonitorStateException。sleep()与wait()的区别: sleep(): 可以在任何地方调用,不释放锁。 wait(): 只能在同步代码块中调用,并释放锁。
线程安全单例模式 懒汉式实现: public class Bank { private static Bank instance = null; public static Bank getInstance() { if (instance == null) { synchronized (Bank.class) { if (instance == null) { instance = new Bank(); } } } return instance; } }
常见面试问题:如何判断线程的死锁?
String不可变,StringBuffer和StringBuilder可变。StringBuffer线程安全,效率低;StringBuilder线程不安全,效率高。建议在单线程环境下使用StringBuilder。
常用方法: append() delete() setCharAt() replace() charAt() StringBuilder的效率优于 StringBuffer。
集合框架提供了静态集合如 singletonSet、singletonList等,不是 thread-safe。具有动态、有序等特性。
List接口实现类: ArrayList:效率高,线程不安全 LinkedList:效率高,线程不安全 Vector:反向兼容旧代码,效率低 Deque:队列结构
Map接口 -hashmap:哈希表实现 -hashset:哈希集合 -linkedhashmap:有序哈希表 -linkedlist:双向链表
Map工具类 Collections工具类提供: reverse() 调转列表 shuffle()随机排序 sort()按照自然顺序排序 swap()交换元素位置 max()、min()获取最大或最小元素
集合与数组 数组的优缺点:
集合的优点:灵活、高效,支持重复元素、有序/无序,类型安全。
泛型:定义在类、接口、方法中的类型参数。用于高度抽象化,解决类型复杂性。 使用场景:
示例: List<?>ёр устанmdpante(Collection collection).
Stringbuffer与StringBuilder Stringbuffer:线程安全。 StringBuilder:线程不安全,但效率更高。
FileInputStream和FileOutputStream用于操作文件流。File类用于管理文件路径、目录等操作,常用于文件的创建、删除、读写。
缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter 提高读写效率。
读写示例: String文件读取: BufferedReader reader = new BufferedReader(new FileReader(new File("test.txt"))); String line = reader.readLine();
class NumberThread implements Runnable { @Override public void run() { for (int i = 0; i <= 100; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName() + ": " + i); } } }}class NumberThread1 implements Runnable { @Override public void run() { for (int i = 0; i <= 100; i++) { if (i % 2 != 0) { System.out.println(Thread.currentThread().getName() + ": " + i); } } }}public class ThreadPool { public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); service.execute(new NumberThread()); service.execute(new NumberThread1()); try { service.shutdown(); service.awaitTermination(100, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } }} 三点总结:
反射机制允许在程序运行时对类进行目光操作,如获取类信息、创建对象、调用方法、访问私有成员等。反射机制的常用场景有:
反射类: Class:类信息 Method:方法操作 Object:基本反射操作 Constructor:构造函数 Field:字段操作
反射示例:
class BaseService { protected void doSomething() {}}public class BaseServlet extends HttpService { @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ... { try { String action = req.getParameter("action"); Method method = getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, res); } catch (Exception e) { e.printStackTrace(); } }} 反射机制注意事项:
File类操作文件和目录,常见操作包括:
File构造方式: File(String filePath) File(String parentPath, String childPath) File(File parentFile, String childPath)
路径分类:
路径分隔符依赖操作系统:
转载地址:http://emymz.baihongyu.com/