Java线程实践:Runnable与Thread的区别

需积分: 0 0 下载量 22 浏览量 更新于2024-06-16 收藏 2.88MB DOCX 举报
“线程学习” 线程是操作系统中并发执行的基本单位,它们允许程序同时处理多个任务,提高系统效率。在Java中,我们有两种主要的方式来创建线程:继承`Thread`类和实现`Runnable`接口。 1. 实现Runnable接口的优势: - 资源共享:当多个线程需要共享同一资源时,实现`Runnable`接口更为合适。因为一个类只能直接继承一个父类(Java的单继承特性),但可以实现多个接口,这样不会限制类的继承关系。 - 代码独立:`Runnable`对象可以被多个线程共享,实现代码与数据的分离,提高了代码的复用性。 - 增强程序的健壮性:通过接口实现线程,可以减少耦合性,使得代码更加稳定和易于维护。 2. 示例代码分析: - `ThreadDemo1`类中,主线程创建了一个`TestThread`的实例并启动,然后进入无限循环。当`index`达到100时,主线程尝试调用`tt.join()`,这会让主线程等待`TestThread`完成或达到指定的毫秒数。 - 当`join()`没有参数时,主线程与子线程交替运行,直到`index`等于100后,子线程持续运行,主线程不再参与。 - 当`join(10000)`有参数时,子线程先运行10秒,之后每10秒与主线程交替执行。 3. 继承Thread类与实现Runnable接口的区别: - 创建方式:继承`Thread`类时,只需重写`run()`方法,而实现`Runnable`接口则需将`run()`方法放入实现的类中,并通过`Thread`构造函数传入`Runnable`对象来创建线程。 - 多态性:`Runnable`接口遵循多态原则,而继承`Thread`类则受限于单继承机制。 - 线程数量:一个`Thread`对象只能关联一个`Runnable`实例,所以实现`Runnable`可以创建多个线程共享同一个任务,而继承`Thread`每个实例都是一个独立的线程。 - 异常处理:如果`run()`方法抛出未捕获的异常,`Thread`类会捕获并打印,而`Runnable`接口则会终止包含它的线程。 4. 示例代码对比: - 在`ThreadDemo1`的第二个版本中,四个`TestThread`实例分别启动,它们都有自己的`Thread`对象,因此可以独立运行。每个线程都有自己的`ticket`变量,可以独立计数,展示了多线程同时操作资源的情况。 选择实现`Runnable`接口还是继承`Thread`取决于具体需求。如果需要多线程共享数据,或者避免单继承限制,应选择实现`Runnable`。而如果需要对线程进行定制,如添加额外的方法或状态,直接继承`Thread`可能更合适。在实际开发中,根据项目需求灵活运用这些知识,能够有效地提升程序的并发性能和结构合理性。