`
caiwb1990
  • 浏览: 314759 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java多线程总结: 线程的两种创建方式及优劣比较

    博客分类:
  • java
 
阅读更多
1、通过实现Runnable接口线程创建

(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

(2).创建Runnable接口实现类的对象。

(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)

(4).调用Thread对象的start()方法,启动线程

.package demo.thread;
public class TreadDemo1 implements Runnable {
private int countDown = 10;
 @Override
// 在run方法中定义任务
 public void run() {
 while (countDown-- > 0) {
System.out.println("#" + Thread.currentThread().getName() + "("
 + countDown + ")");
 }
}

 public static void main(String[] args) {
 // Runnable中run方法是一个空方法,并不会产生任何线程行为,必须显式地将一个任务附着到线程上
 TreadDemo1 tt=new TreadDemo1();
 new Thread(tt).start();
 new Thread(tt).start();
System.out.println("火箭发射前倒计时:");
 }
}


#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
#Thread-0(9)


2、通过继承Thread类创建线程
(1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).直接创建一个ThreadDemo2类的对象,也可以利用多态性,变量声明为父类的类型。

(3).调用start方法,线程t启动,隐含的调用run()方法。

package demo.thread;
public class ThreadDemo2 extends Thread {
 private int countDown = 10;
 @Override
// 在run方法中定义任务
 public void run() {
 while (countDown-- > 0) {
 System.out.println("#" + this.getName() + "(" + countDown + ")");
 }
 }
 public static void main(String[] args) {
new ThreadDemo2().start();
 new ThreadDemo2().start();
 // 由于start方法迅速返回,所以main线程可以执行其他的操作,此时有两个独立的线程在并发运行
 System.out.println("火箭发射前倒计时:");
 }
}
package demo.thread;
public class ThreadDemo2 extends Thread {
private int countDown = 10;

@Override
// 在run方法中定义任务
public void run() {
while (countDown-- > 0) {
System.out.println("#" + this.getName() + "(" + countDown + ")");
}
}

public static void main(String[] args) {
new ThreadDemo2().start();
new ThreadDemo2().start();
// 由于start方法迅速返回,所以main线程可以执行其他的操作,此时有两个独立的线程在并发运行
System.out.println("火箭发射前倒计时:");
}
}


#Thread-0(9)
#Thread-0(8)
#Thread-0(7)
#Thread-0(6)
#Thread-0(5)
#Thread-0(4)
#Thread-0(3)
#Thread-0(2)
#Thread-0(1)
#Thread-0(0)
火箭发射前倒计时:
#Thread-1(9)
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)


3、两种方式的比较

首先分析两种方式的输出结果,同样是创建了两个线程,为什么结果不一样呢?

使用实现Runnable接口方式创建线程可以共享同一个目标对象(TreadDemo1 tt=new TreadDemo1();),实现了多个相同线程处理同一份资源。

然后再看一段来自JDK的解释:

Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参数方法。

设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了Runnable。激活的意思是说某个线程已启动并且尚未停止。

此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。


采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
分享到:
评论

相关推荐

    JAVA线程的两种创建方式及优劣比较.pdf

    两种方式的优劣比较: - **实现Runnable接口**: - 优点:避免了单继承的限制,可以与其他接口结合使用,适合多个线程共享同一个资源的情况。 - 缺点:需要通过Thread类来创建和启动线程,增加了代码的复杂性。 ...

    java多媒体与多线程处理实验

    ### Java多媒体与多线程...通过本次实验,学生不仅掌握了Java多线程编程的基础知识,还学会了如何利用多线程优化程序性能,特别是在多媒体应用领域,如动画、音视频处理等,为后续更复杂的应用开发奠定了坚实的基础。

    Java多线程学习资料

    这两种方式各有优劣,前者可以直接调用`start()`方法启动,后者则需将`Runnable`对象传递给`Thread`类的构造器。 2. **线程的状态**:Java线程有五种状态:新建、可运行、运行、阻塞和死亡。了解这些状态有助于理解...

    java多线程编程详解

    Java多线程的实现主要有两种途径:继承`Thread`类和实现`Runnable`接口。这两种方式各有优劣,但共同目标都是定义线程的行为。继承`Thread`类的方法相对直观,通过重写`run()`方法即可指定线程的运行逻辑。然而,...

    Java多线程程序设计详细解析

    ### Java多线程程序设计详细解析 #### 一、理解多线程机制 多线程是一种允许多个指令流在程序中并发执行的机制,这些指令流被称为线程,它们在逻辑上是“同时”执行的,但实际上可能由于单个CPU的限制而采取时间片...

    张孝祥java就业培训教程第五章_多线程WORD版

    总之,"张孝祥Java就业培训教程第五章_多线程"涵盖了Java多线程编程的核心知识,包括线程的创建与管理、同步机制、线程安全的数据结构以及并发工具的使用。掌握这些内容对于成为一名合格的Java开发者至关重要,无论...

    Java多线程学习-动力节点共22页.pdf.zip

    两种方式各有优劣,前者可以方便地继承其他类,后者则更适合资源共享。 2. **线程启动与终止**:`start()`方法用于启动线程,此时会调用`run()`方法。而`stop()`方法在Java中已不推荐使用,因为存在安全问题,现在...

    多线程最完整的思维导图

    在Java等编程语言中,多线程的实现主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类可以直接覆盖run()方法,而实现Runnable接口则需要重写run()方法,并通过Thread对象启动。这两种方式各有优劣,选择...

    详细JAVA线程第三版

    Java提供了两种创建线程的方式:通过实现Runnable接口或继承Thread类。这两种方法各有优劣,实现Runnable接口更为灵活,因为它可以避免单继承的限制,而直接继承Thread则更方便直接控制线程的行为。 书中深入探讨了...

    多线程.rar

    4. **线程安全类**:如ArrayList不是线程安全的,而Vector和CopyOnWriteArrayList是线程安全的,比较它们在多线程环境下的优劣。 5. **死锁示例**:模拟死锁情况,分析并解决死锁问题,理解死锁条件。 6. **线程...

    简单了解Java编程中线程的创建与守护线程

    Java编程中的线程创建是多线程并发编程的核心部分,它允许程序同时执行多个任务,从而提高效率和响应速度。线程有两种主要的创建方式:通过实现`Runnable`...理解这两种方式的差异和适用场景是Java多线程编程的基础。

    Java多线程之显示锁和内置锁总结详解

    总结来说,Java多线程中的内置锁和显式锁各有优劣。内置锁简洁易用,但控制有限;显式锁提供了更多灵活性,但使用起来相对复杂。根据具体应用场景选择合适的锁机制,能有效提高并发程序的性能和可维护性。

    java并发编程笔记

    在Java中,实现多线程功能主要有两种途径:一种是通过实现`Runnable`接口,另一种则是通过继承`Thread`类。这两种方式各有优劣,具体选择哪一种取决于具体的应用场景。 ##### 继承Thread类 1. **基础概念**: - ...

    java试题精选50道(经典)

    - 线程的创建:通过Thread类和实现Runnable接口两种方式创建线程。 - 线程同步:理解synchronized关键字,掌握wait、notify和notifyAll方法的使用。 - 线程池:了解ExecutorService和ThreadPoolExecutor,如何...

    Java并发编程面试题(2024最新版)-重点.docx

    多线程的概念及优劣:** - **定义:**多线程是指在一个程序中包含多个执行路径的技术。 - **优点:** - 提高系统资源的利用率。 - 增强程序的响应性和交互性。 - **缺点:** - 设计复杂度高。 - 存在线程间的...

    用java编写的中国象棋

    在中国象棋这个项目中,开发者使用...总的来说,这个Java编写的中国象棋项目涵盖了面向对象编程、图形界面设计、事件处理、数据结构与算法、多线程、异常处理以及文件操作等多个核心Java技术,是一个综合性的编程实践。

    singleton设计模式java实现及对比

    这种方法结合了前两种方式的优点,既延迟初始化又避免了不必要的同步。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton ...

    Java并发编程面试题(2022最新版)

    **多线程的优劣** - **优点:** - 提高CPU利用率。 - 增强应用程序的交互性。 - 提升系统的整体性能。 - **劣势:** - 设计和调试困难。 - 可能导致资源争用问题。 - 存在线程安全问题。 **线程和进程的区别...

    2组JAVA网络爬虫算法

    1. 多线程/异步:利用Java并发库,如ExecutorService,创建多线程爬虫,同时处理多个URL,提高抓取速度。 2. 并行下载:使用线程池管理下载任务,减少IO阻塞,提高整体效率。 3. 节流与反反爬:设置合理的请求间隔,...

    java随机数

    Java提供两种主要的方式来生成随机数:`java.lang.Math.random()` 和 `java.util.Random` 类。这两种方法各有优劣,适用于不同的场景。 #### Math.random() `Math.random()` 是一个简单易用的方法,用于生成一个...

Global site tag (gtag.js) - Google Analytics