Java并发编程实践-电子书-01章
### Java并发编程实践基础知识点详解 #### 1.1 进程与线程 ##### 1.1.1 进程 **进程的概念** 进程是操作系统中表示正在运行的程序的一个实例,它是系统进行资源分配和调度的基本单位。在多道程序环境中,进程不再像单道程序那样独占所有资源,而是与其他进程共享这些资源。 **程序的封闭性与可再现性** - **封闭性**:指程序一旦开始运行,除了人为干预或硬件故障外,其计算结果仅由程序本身决定。 - **可再现性**:指在相同的初始条件下,同一程序运行的结果总是相同的。 **资源共享与并行** - **资源共享**:在多道程序环境中,资源不再是单个程序独占的,而是由多个程序共享。 - **并发运行**:多个程序可以同时或交替运行,提高了系统的整体效率。 ##### 1.1.2 线程 **线程的概念** 线程是进程内的一个执行单元,是CPU调度和分派的基本单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和其他资源,但每个线程都有独立的栈和局部变量。 **线程的特点** - **轻量级**:相比于创建一个新的进程,创建一个新线程的开销较小。 - **通信简便**:由于线程共享进程的内存空间,线程间的数据交换比进程间的数据交换更简单。 - **并发执行**:线程可以在一个进程中并发执行,提高程序的响应能力和执行效率。 #### 1.2 创建多线程 ##### 1.2.1 继承Thread类创建线程 通过继承`Thread`类并重写`run`方法来定义线程的行为,这种方式简单直观,但不推荐过多使用,因为Java不支持多重继承,这限制了其他继承的需求。 **示例代码**: ```java public class MyThread extends Thread { @Override public void run() { System.out.println("线程运行"); } public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } ``` ##### 1.2.2 实现Runnable接口创建线程 通过实现`Runnable`接口并重写`run`方法来定义线程的行为,这种方式更加灵活,可以实现多个接口,也可以被多个线程共享。 **示例代码**: ```java public class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程运行"); } public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } } ``` ##### 1.2.3 使用线程池 线程池是一种管理多个线程的技术,它能够复用已创建的线程,减少了创建和销毁线程的开销。Java中提供了`ExecutorService`接口和其实现类`ThreadPoolExecutor`等工具类来方便地创建线程池。 **示例代码**: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { Runnable worker = new WorkerThread("" + i); executor.execute(worker); } executor.shutdown(); } } class WorkerThread implements Runnable { private String command; public WorkerThread(String s) { this.command = s; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " 开始. 命令 = " + command); processCommand(); System.out.println(Thread.currentThread().getName() + " 结束."); } private void processCommand() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` #### 1.3 线程的基本控制 ##### 1.3.1 使用Sleep暂停执行 `Thread.sleep(long millis)`方法可以让当前正在执行的线程暂停指定的时间,使其他线程有机会执行。 **示例代码**: ```java public class SleepExample { public static void main(String[] args) { System.out.println("主线程开始"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主线程结束"); } } ``` ##### 1.3.2 使用join等待另一个线程结束 `Thread.join()`方法可以使当前线程等待另一个线程结束。 **示例代码**: ```java public class JoinExample { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { System.out.println("子线程开始"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子线程结束"); }); thread.start(); thread.join(); // 等待子线程结束 System.out.println("主线程结束"); } } ``` ##### 1.3.3 使用中断(Interrupt)取消线程 `Thread.interrupt()`方法可以中断线程,但需要在线程内部捕获`InterruptedException`异常。 **示例代码**: ```java public class InterruptExample { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("线程被中断"); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("线程运行中"); } }); thread.start(); Thread.sleep(2000); thread.interrupt(); // 中断线程 } } ``` ##### 1.3.4 使用Stop终止线程 `Thread.stop()`方法已被弃用,因为它可能导致对象处于不一致的状态。通常建议使用中断机制来停止线程。 **示例代码**: ```java // 不推荐使用 public class StopExample { public static void main(String[] args) { Thread thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("线程运行中"); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } System.out.println("线程被停止"); }); thread.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } thread.interrupt(); // 中断线程 } } ``` ##### 1.3.5 结束程序的执行 结束程序的执行通常可以通过正常返回或者抛出未捕获的异常来实现。 **示例代码**: ```java public class ExitExample { public static void main(String[] args) { System.out.println("程序开始"); // 正常结束 System.exit(0); // 或者抛出未捕获的异常 // throw new RuntimeException("程序异常"); } } ``` #### 1.4 并发编程实践简述 并发编程涉及多线程之间的同步与通信机制,以确保数据一致性。Java提供了多种同步机制,如`synchronized`关键字、`ReentrantLock`类、`Semaphore`类等,用于控制多个线程对共享资源的访问。 - **synchronized关键字**:用于同步方法或同步块,确保同一时间只有一个线程能够执行被`synchronized`修饰的方法或代码块。 - **ReentrantLock类**:提供了一个更为灵活的锁机制,可以显式地获取和释放锁。 - **Semaphore类**:用于控制多个线程对有限资源的访问,类似于信号量机制。 并发编程的核心在于理解和应用这些同步机制,以防止数据竞争和死锁等问题的发生。通过合理地设计和实现并发程序,可以显著提升程序的性能和可靠性。
- 粉丝: 0
- 资源: 18
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助