Java并发编程:实现Runnable与Thread类

需积分: 9 0 下载量 28 浏览量 更新于2024-09-10 收藏 303KB PDF 举报
"java并发编程笔记" Java并发编程是Java开发中的重要组成部分,它涉及到如何让多个任务在同一时间执行,以提高程序的效率和响应性。在Java中,实现并发有多种方式,其中最常见的是通过实现`Runnable`接口和继承`Thread`类。 1. 实现Runnable接口 这种方式下,你创建一个实现了`Runnable`接口的类,然后在`run()`方法中编写线程执行的代码。这种方式的好处在于,由于Java不支持多重继承,因此你可以避免因为继承`Thread`而无法继承其他类的问题。此外,通过将`Runnable`对象传递给`Thread`的构造函数,你可以创建多个`Thread`实例来共享同一个`Runnable`对象,从而实现线程间的资源共享。 示例代码: ```java class MyRunnable implements Runnable { private String name; public MyRunnable(String name) { this.name = name; } public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程开始:" + this.name + ", i=" + i); } } } public class Main { public static void main(String[] args) { Thread t1 = new Thread(new MyRunnable("线程a")); Thread t2 = new Thread(new MyRunnable("线程b")); t1.start(); t2.start(); } } ``` 2. 继承Thread类 当你需要对线程进行定制,比如扩展线程的行为时,可以选择直接继承`Thread`类。在子类中重写`run()`方法,然后创建子类的实例并调用`start()`来启动线程。 示例代码(与给定内容类似): ```java class MyThread extends Thread { private String name; public MyThread(String name) { super(); this.name = name; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程开始:" + this.name + ", i=" + i); } } } public class Main { public static void main(String[] args) { MyThread mt1 = new MyThread("线程a"); MyThread mt2 = new MyThread("线程b"); mt1.start(); mt2.start(); } } ``` 启动线程的关键:start() vs run() 调用`start()`方法是启动线程的关键。当你直接调用`run()`方法时,代码会在当前线程(主线程)中顺序执行,而不是创建新的线程。而`start()`方法会启动一个新的线程,并在该线程中执行`run()`方法,从而实现并发执行。 在并发编程中,还需要关注以下知识点: - 线程安全:当多个线程访问同一份数据时,需要确保数据的一致性和完整性,避免数据竞争和死锁等问题。 - 同步机制:包括`synchronized`关键字、`Lock`接口及其实现类,用于控制线程的并发访问,防止数据不一致。 - 线程通信:`wait()`, `notify()`, `notifyAll()`等方法用于线程间的通信,协调线程执行顺序。 - 线程池:`ExecutorService`和`ThreadPoolExecutor`允许你管理和控制线程,提高系统资源利用率,减少线程创建和销毁的开销。 - 并发工具类:如`Semaphore`信号量、`CyclicBarrier`回环栅栏、`CountDownLatch`计数器等,提供高级并发控制手段。 - Future和Callable:允许获取异步计算的结果,与`ExecutorService`配合使用。 理解并熟练掌握这些并发编程概念和工具,对于编写高效、可靠的多线程Java程序至关重要。