`
NiuBilityMan
  • 浏览: 2319 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【Java-线程】Java线程创建方式及对比

    博客分类:
  • Java
阅读更多
Java中创建线程主要有三种方式:

一、继承Thread类创建线程类

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

[java] view plaincopy
01.package com.thread; 
02. 
03.public class FirstThreadTest extends Thread{ 
04.    int i = 0; 
05.    //重写run方法,run方法的方法体就是现场执行体 
06.    public void run() 
07.    { 
08.        for(;i<100;i++){ 
09.        System.out.println(getName()+"  "+i); 
10.         
11.        } 
12.    } 
13.    public static void main(String[] args) 
14.    { 
15.        for(int i = 0;i< 100;i++) 
16.        { 
17.            System.out.println(Thread.currentThread().getName()+"  : "+i); 
18.            if(i==20) 
19.            { 
20.                new FirstThreadTest().run(); 
21.                new FirstThreadTest().run(); 
22.            } 
23.        } 
24.    } 
25. 
26.} 




上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。

二、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

示例代码为:

[java] view plaincopy
01.package com.thread; 
02. 
03.public class RunnableThreadTest implements Runnable 
04.{ 
05. 
06.    private int i; 
07.    public void run() 
08.    { 
09.        for(i = 0;i <100;i++) 
10.        { 
11.            System.out.println(Thread.currentThread().getName()+" "+i); 
12.        } 
13.    } 
14.    public static void main(String[] args) 
15.    { 
16.        for(int i = 0;i < 100;i++) 
17.        { 
18.            System.out.println(Thread.currentThread().getName()+" "+i); 
19.            if(i==20) 
20.            { 
21.                RunnableThreadTest rtt = new RunnableThreadTest(); 
22.                new Thread(rtt,"新线程1").start(); 
23.                new Thread(rtt,"新线程2").start(); 
24.            } 
25.        } 
26. 
27.    } 
28. 
29.} 

三、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

实例代码:

[java] view plaincopy
01.package com.thread; 
02. 
03.import java.util.concurrent.Callable; 
04.import java.util.concurrent.ExecutionException; 
05.import java.util.concurrent.FutureTask; 
06. 
07.public class CallableThreadTest implements Callable<Integer> 
08.{ 
09. 
10.    public static void main(String[] args) 
11.    { 
12.        CallableThreadTest ctt = new CallableThreadTest(); 
13.        FutureTask<Integer> ft = new FutureTask<>(ctt); 
14.        for(int i = 0;i < 100;i++) 
15.        { 
16.            System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i); 
17.            if(i==20) 
18.            { 
19.                new Thread(ft,"有返回值的线程").start(); 
20.            } 
21.        } 
22.        try 
23.        { 
24.            System.out.println("子线程的返回值:"+ft.get()); 
25.        } catch (InterruptedException e) 
26.        { 
27.            e.printStackTrace(); 
28.        } catch (ExecutionException e) 
29.        { 
30.            e.printStackTrace(); 
31.        } 
32. 
33.    } 
34. 
35.    @Override 
36.    public Integer call() throws Exception 
37.    { 
38.        int i = 0; 
39.        for(;i<100;i++) 
40.        { 
41.            System.out.println(Thread.currentThread().getName()+" "+i); 
42.        } 
43.        return i; 
44.    } 
45. 
46.} 

二、创建线程的三种方式的对比

采用实现Runnable、Callable接口的方式创见多线程时,优势是:

线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

劣势是:

编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

使用继承Thread类的方式创建多线程时优势是:

编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

劣势是:

线程类已经继承了Thread类,所以不能再继承其他父类。

来源:http://blog.csdn.net/longshengguoji/article/details/41126119
分享到:
评论

相关推荐

    JAVA线程高级-线程按序交替执行

    - `ExecutorService`和`ThreadPoolExecutor`提供了线程池管理,通过复用线程提高效率,还能控制并发程度,避免大量创建销毁线程带来的开销。 - 可以通过`execute()`方法提交任务,线程池会根据策略决定何时及如何...

    Java-Thread-Affinity,将Java线程绑定到给定的内核.zip

    Java线程亲和性(Thread Affinity)是一个高级并发编程概念,主要涉及到操作系统调度和硬件资源的优化。在多核处理器系统中,线程亲和性允许开发者指定某个线程应该运行在哪个特定的处理器核心上,从而提高性能、...

    北大Java--多线程

    - Java线程有优先级,通过`setPriority()`方法设置。线程调度策略可能依赖于操作系统的具体实现,但通常优先级高的线程会被优先调度。 5. **多线程的互斥与同步**: - 互斥是指在同一时刻,只有一个线程能访问...

    经典Java --线程

    创建Java线程主要有两种方式: 1. 继承Thread类:创建一个新的类,继承自Thread类,并重写其run()方法。然后创建该类的实例并调用start()方法启动线程。 ```java class MyThread extends Thread { public void run...

    JAVA-多线程 所有文件

    4. **线程状态**:Java线程有五种状态:新建、就绪、运行、阻塞和终止。了解这些状态有助于理解线程的生命周期。 5. **同步机制**:Java提供了多种同步机制防止数据竞争,如`synchronized`关键字、`wait()`, `...

    计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 21. 两种创建方式的对比.avi

    计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 21. 两种创建方式的对比.avi

    Java特别篇-关于线程创建的三种方式的总结对比

    ### Java特别篇-关于线程创建的三种方式的总结对比 #### 一、常见3种创建线程的方式 ##### (1)方式1:继承Thread类的方式 - **创建步骤**: - 创建一个类,继承`Thread`类。 - 重写`run()`方法,该方法将包含...

    Java多线程-JDK5.0新增线程创建方式

    ### Java多线程-JDK5.0新增线程创建方式 #### 一、新增方式1:实现Callable接口 ##### (1)介绍 自Java 5.0起,为提高线程管理的灵活性与效率,引入了`Callable`接口,这是一种全新的创建线程的方式。与传统的`...

    java编程 ---线程

    在Java中,有两种主要方式创建线程:继承`Thread`类或实现`Runnable`接口。启动线程通常通过调用`start()`方法,该方法会自动调用线程的`run()`方法。线程调度由操作系统负责,Java提供了一些控制线程优先级和同步的...

    Java多线程-对比创建多线程的两种方式

    Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...

    计算机后端-Java-Java核心基础-第21章 常用类 03. 复习:线程通信和新的线程创建方式等.avi

    计算机后端-Java-Java核心基础-第21章 常用类 03. 复习:线程通信和新的线程创建方式

    Java Socket学习---单线程阻塞

    "Java Socket学习---单线程阻塞"这个主题主要探讨了如何使用Java的Socket类进行单线程的阻塞式通信,这种模式通常用于简单的客户端-服务器应用。在这个场景中,服务器端通过一个线程处理一个客户端的请求,当请求被...

    Java多线程编程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的...

    Java-Java线程编程教程

    Java线程编程是Java开发中的重要组成部分,尤其在如今并发处理和高性能系统设计中不可或缺。本教程将深入探讨Java多线程的相关概念、原理及实战技巧。 首先,我们需要理解什么是线程。线程是程序执行的基本单元,一...

    java常见面试题---线程篇

    以下是一些关于Java线程的常见面试知识点,这些内容可能出现在线程.doc文档中: 1. **线程的创建方式**: - 实现`Runnable`接口:创建一个类实现`Runnable`接口,并重写`run()`方法,然后将实例传递给`Thread`类的...

    JAVA-JavaThreadProgramming-Sams.zip_JAVA 设计_java 多线程_java 线程_多线程

    Java线程编程是Java开发中的重要组成部分,尤其在构建高性能、高并发的应用程序时不可或缺。本资料"JAVA-JavaThreadProgramming-Sams.zip"提供了一套详细的教程,旨在深入讲解Java中的多线程设计和实现。 Java多...

    Java中实现线程的三种方式及对比_动力节点Java学院整理

    Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 Runnable 接口创建线程类、通过 Callable 和 Future 创建线程。 继承 Thread 类创建线程类 继承 Thread 类创建...

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    java-websocket jar包

    在Android环境中,使用`java-websocket`库时,需要注意网络操作需要在后台线程中执行,以避免因主线程阻塞引发的ANR(Application Not Responding)错误。同时,需要确保AndroidManifest.xml中包含了对应的网络权限...

    Java多线程知识点总结

    线程池是一种多线程处理形式,它将线程和任务的概念分离开来,能够有效管理线程资源,减少线程创建和销毁的开销,提高程序性能。Java中可以通过Executors类快速创建线程池。 随着Java版本的更新,Java也引入了新的...

Global site tag (gtag.js) - Google Analytics