本文共 4409 字,大约阅读时间需要 14 分钟。
程序是由一组指令组成的静态代码集合。一个进程是指运行中执行的程序的一次执行过程,系统为每个进程分配独立的内存区域。线程是进程的一部分,作为程序的执行路径,每个线程具有独立的运行栈和程序计数器。
并行:多个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与StringBuilderStringbuffer:线程安全。 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/