
Java 第七章第八章 案例教程说明:本教程为Java基础系列的最后两章。第七章聚焦多线程与并发(Thread、Runnable、同步、锁、线程池、Callable、Future);第八章讲解网络编程与JDBC(Socket、ServerSocket、URL、JDBC连接MySQL、CRUD操作、PreparedStatement、事务)。通过“多线程下载模拟”和“学生管理系统数据库版”实战串联知识点。第一部分:第七章 多线程与并发一、背景故事:小杨需要提高程序执行效率小杨的学生管理系统在批量导入学生数据时,需要从多个文件中读取数据并处理。如果单线程顺序执行,速度很慢。他希望通过多线程让多个任务同时执行,充分利用CPU资源,缩短总耗时。二、线程基础2.1 进程与线程· 进程:操作系统分配资源的最小单位,一个程序运行就是一个进程。· 线程:CPU调度的最小单位,一个进程可以包含多个线程,共享进程资源。Java 天生支持多线程,通过 java.lang.Thread 类实现。2.2 创建线程的两种方式方式一:继承 Thread 类classMyThreadextendsThread{privateStringname;publicMyThread(Stringname){this.name=name;}@Overridepublicvoidrun(){for(inti=0;i5;i++){System.out.println(name+" 执行: "+i);try{Thread.sleep(100);// 暂停100毫秒}catch(InterruptedExceptione){e.printStackTrace();}}}}// 使用MyThreadt1=newMyThread("线程A");MyThreadt2=newMyThread("线程B");t1.start();// 启动线程,自动调用 run()t2.start();方式二:实现 Runnable 接口(推荐)classMyRunnableimplementsRunnable{privateStringname;publicMyRunnable(Stringname){this.name=name;}@Overridepublicvoidrun(){for(inti=0;i5;i++){System.out.println(name+" 执行: "+i);try{Thread.sleep(100);}catch(InterruptedExceptione){}}}}// 使用Threadt1=newThread(newMyRunnable("线程A"));Threadt2=newThread(newMyRunnable("线程B"));t1.start();t2.start();区别:实现 Runnable 更灵活(Java 单继承,可实现多个接口),适合多个线程共享同一资源。2.3 线程常用方法方法 说明start() 启动线程,JVM 调用 run()run() 线程执行体,需重写sleep(long millis) 让当前线程休眠指定毫秒join() 等待该线程终止yield() 让出 CPU,回到就绪状态interrupt() 中断线程setName() / getName() 设置/获取线程名称setPriority(int) 优先级 1~10,默认5Threadt=newThread(()-{for(inti=0;i10;i++){System.out.println(Thread.currentThread().getName()+": "+i);}});t.setName("工作线程");t.start();try{t.join();// 主线程等待 t 执行完}catch(InterruptedExceptione){}System.out.println("主线程结束");三、线程同步与锁当多个线程访问共享数据时,可能产生数据不一致(竞态条件)。需要同步机制。3.1 synchronized 关键字classCounter{privateintcount=0;// 同步方法publicsynchronizedvoidincrement(){count++;}// 同步代码块publicvoiddecrement(){synchronized(this){count--;}}publicintgetCount(){returncount;}}模拟银行取款问题:classBankAccount{privateintbalance=1000;publicsynchronizedvoidwithdraw(intamount){if(balance=amount){System.out.println(Thread.currentThread().getName()+" 准备取款");try{Thread.sleep(50);}catch(InterruptedExceptione){}balance-=amount;System.out.println(Thread.currentThread().getName()+" 取款成功,余额: "+balance);}else{System.out.println(Thread.currentThread().getName()+" 余额不足");}}}3.2 Lock 接口(更灵活)importjava.util.concurrent.locks.Lock;import