多线程02:《疯狂Java讲义》学习笔记——线程的创建和启动
2016-05-10 21:06
453 查看
注:此文为学习《疯狂Java讲义》的笔记,因此内容全部来自于该书中。
1.继承Thread类创建线程类
通过继承Thread类来创建并启动多线程的步骤:(1)定义Thread类的子类,并重写该类的run()方法,该run()方法体代表了线程需要完成的任务,run()方法体也称为线程执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。
方法:
Thread.currentThread(),是Thread类的静态方法,该方法总是返回当前正在执行的线程对象。
getName(),该方法是Thread类的实例方法,该方法返回调用该方法的线程名字。
2.实现Runnable接口创建线程类
实现Runnable接口来创建并启动多线程的步骤如下。(1)定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体是线程的执行体。(2)创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。可以在创建Thread对象时为该对象指定一个名字。(3)调用线程对象的start()方法来启动该线程。
3.使用Callable和Future创建线程
Java 5开始,Java提供了Callable接口,该接口提供了一个call()方法。call()方法可以有返回值,call()方法可以声明抛出异常。
Java 5提供了Future接口来代表Callable接口里call()方法的返回值,为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口。
创建并启动有返回值的线程的步骤:(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值。再创建Callable实现类的实例。(2)使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值。(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。(4)调用FutureTask对象的get()方法来获得子线程执行后的返回值。
4.创建线程的三种方式对比
Callable接口里定义的方法有返回值,可以声明抛出异常。
采用Runnable、Callable接口创建多线程的优缺点:线程类只实现了Runnable接口或Callable接口,还可以继承其他类。在这种方式下,多个线程可以共享同一个target对象,所以非常适合对个相同线程来处理同一份资源的情况,从而将CPU、代码和数据分开,形成清晰的模型。劣势,编程稍稍复杂,访问当前线程必须要有Thread.currentThread()方法。
采用继承Thread类的方式创建多线程,劣势是,不能再继承其他父类。优势,编写简单,如果需要访问当前线程,不必使用Thread.currentThread()方法,直接使用this即可获得当前线程。
一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。
1.继承Thread类创建线程类
通过继承Thread类来创建并启动多线程的步骤:(1)定义Thread类的子类,并重写该类的run()方法,该run()方法体代表了线程需要完成的任务,run()方法体也称为线程执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。
方法:
Thread.currentThread(),是Thread类的静态方法,该方法总是返回当前正在执行的线程对象。
getName(),该方法是Thread类的实例方法,该方法返回调用该方法的线程名字。
2.实现Runnable接口创建线程类
实现Runnable接口来创建并启动多线程的步骤如下。(1)定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体是线程的执行体。(2)创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。可以在创建Thread对象时为该对象指定一个名字。(3)调用线程对象的start()方法来启动该线程。
3.使用Callable和Future创建线程
Java 5开始,Java提供了Callable接口,该接口提供了一个call()方法。call()方法可以有返回值,call()方法可以声明抛出异常。
Java 5提供了Future接口来代表Callable接口里call()方法的返回值,为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口。
Modifier and Type | Method and Description |
boolean | cancel(boolean mayInterruptIfRunning) Attempts to cancel execution of this task. |
V | get() Waits if necessary for the computation to complete, and then retrieves its result. |
V | get(long timeout,TimeUnit unit) Waits if necessary for at most the given time for the computation to complete, and then retrieves its result, if available. |
boolean | isCancelled() Returns trueif this task was cancelled before it completed normally. |
boolean | isDone() Returns trueif this task completed. |
4.创建线程的三种方式对比
Callable接口里定义的方法有返回值,可以声明抛出异常。
采用Runnable、Callable接口创建多线程的优缺点:线程类只实现了Runnable接口或Callable接口,还可以继承其他类。在这种方式下,多个线程可以共享同一个target对象,所以非常适合对个相同线程来处理同一份资源的情况,从而将CPU、代码和数据分开,形成清晰的模型。劣势,编程稍稍复杂,访问当前线程必须要有Thread.currentThread()方法。
采用继承Thread类的方式创建多线程,劣势是,不能再继承其他父类。优势,编写简单,如果需要访问当前线程,不必使用Thread.currentThread()方法,直接使用this即可获得当前线程。
一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序