java创建线程的三种方式及其对照
Java中创建线程主要有三种方式:
一、继承Thread类创建线程类
(1)定义Thread类的子类。并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务。因此把run()方法称为运行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
package com.thread;public class FirstThreadTest extends Thread{int i = 0;//重写run方法。run方法的方法体就是现场运行体public void run(){for(;i<100;i++){System.out.println(getName()+" "+i);}}public static void main(String[] args){for(int i = 0;i< 100;i++){System.out.println(Thread.currentThread().getName()+" : "+i);if(i==20){new FirstThreadTest().start();new FirstThreadTest().start();}}}}
上述代码中Thread.currentThread()方法返回当前正在运行的线程对象。GetName()方法返回调用该方法的线程的名字。
二、通过Runnable接口创建线程类
(1)定义runnable接口的实现类,并重写该接口的run()方法。该run()方法的方法体相同是该线程的线程运行体。
(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象。该Thread对象才是真正的线程对象。
(3)调用线程对象的start()方法来启动该线程。
演示样例代码为:
package com.thread;public class RunnableThreadTest implements Runnable
{private int i;public void run(){for(i = 0;i <100;i++){System.out.println(Thread.currentThread().getName()+" "+i);}}public static void main(String[] args){for(int i = 0;i < 100;i++){System.out.println(Thread.currentThread().getName()+" "+i);if(i==20){RunnableThreadTest rtt = new RunnableThreadTest();new Thread(rtt,"新线程1").start();new Thread(rtt,"新线程2").start();}}}}
三、通过Callable和Future创建线程
(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程运行体。而且有返回值。
(2)创建Callable实现类的实例。使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。
(4)调用FutureTask对象的get()方法来获得子线程运行结束后的返回值
实例代码:
package com.thread;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class CallableThreadTest implements Callable<Integer>
{public static void main(String[] args){CallableThreadTest ctt = new CallableThreadTest();FutureTask<Integer> ft = new FutureTask<>(ctt);for(int i = 0;i < 100;i++){System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);if(i==20){new Thread(ft,"有返回值的线程").start();}}try{System.out.println("子线程的返回值:"+ft.get());} catch (InterruptedException e){e.printStackTrace();} catch (ExecutionException e){e.printStackTrace();}}@Overridepublic Integer call() throws Exception{int i = 0;for(;i<100;i++){System.out.println(Thread.currentThread().getName()+" "+i);}return i;}}
二、创建线程的三种方式的对照
採用实现Runnable、Callable接口的方式创见多线程时。优势是:
线程类仅仅是实现了Runnable接口或Callable接口。还能够继承其它类。
在这样的方式下,多个线程能够共享同一个target对象。所以很适合多个同样线程来处理同一份资源的情况,从而能够将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程略微复杂。假设要訪问当前线程,则必须使用Thread.currentThread()方法。
使用继承Thread类的方式创建多线程时优势是:
编写简单。假设须要訪问当前线程,则无需使用Thread.currentThread()方法,直接使用this就可以获得当前线程。
劣势是:
线程类已经继承了Thread类。所以不能再继承其它父类。
java创建线程的三种方式及其对照相关推荐
- java 创建线程_【80期】说出Java创建线程的三种方式及对比
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...
- Java创建线程的三种方式
一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...
- Java 创建线程的三种方式
一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...
- Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式
一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...
- java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)
1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...
- 创建线程的三种方式、线程运行原理、常见方法、线程状态
文章目录 1.创建线程的三种方式 1.1 继承Thread类并重写run方法 1.2 使用Runnable配合Thread 1.3 通过Callable和FutureTask创建线程 2.Runnab ...
- 创建线程的三种方式及区别
一:创建线程的三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable接口 二:创建线程的具体实现步骤: 1.继承Thread类 (1).先继承 Thread类,并且 ...
- Java 创建线程的三种方法比较
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...
- Java创建线程的三种方法
这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...
- java创建线程的两种方式及区别
本文将介绍创建线程的两种方式,示例代码在下面,复制粘贴即可 继承Thread类方式和实现Runnable接口方式 区别:由于在开发的过程中,很多的类都会用到继承的方式,如果采用继承的方式会让各个类之间 ...
最新文章
- Centos7安装apt-get 在centos下用yum install xxx 不是使用apt-get
- html print 边距,css print
- python3cookbook_python3-cookbook读书笔记(四)
- java集合对字符串或对象去重
- chrome查看网站字符集编码的方法(不需要安装charset)
- sql exists和not exists用法
- 哪个服务器比较稳定,云服务器哪个比较稳定
- div模拟textarea在ios下不兼容的问题解决
- 测试连接数据库是否成功
- 关于Vista的AppInfo服务被禁的问题
- python 学生编程--3 多彩同心圆
- 概率dp(A - Scout YYF I POJ - 3744 )
- 简单的方法破解百度网盘上带密码的学习视频资源
- win7 Qt5.5安装Qwt 6.1.2
- unity可以直接转h5吗_Unity对H5小游戏开发的支持—Project Tiny
- 前端开发规范和开发文档的书写规范
- GrowingIO 数据采集 iOS SDK 测试实践
- 如何在 Git 中保存用户名和密码?
- 网络安全工程师的职业前景如何?
- 这里是一个有关KiTTY本地化程序 cnKiTTY的简单说明~~
热门文章
- 173.二叉搜索树迭代器
- sql分别对两列数据求和以不同的条件_利用数组与字典,实现双条件数据汇总的方法...
- CS231n Assignment1 Knn
- 天池客流预测–GBDT
- 【bug解决】You should consider upgrading via the 'pip install --upgrade pip' command.
- 关于Activity的四种启动模式详解
- 【Codeforces Round #544 (Div. 3)】K Balanced Teams【线性DP】
- 使用JSPanda扫描客户端原型污染漏洞
- 对短链接服务暴露的URL进行网络侦察
- 简单的docker下载安装jenkins