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创建线程的三种方式及其对照相关推荐

  1. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  2. Java创建线程的三种方式

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

  3. Java 创建线程的三种方式

    一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...

  4. Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式

    一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...

  5. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  6. 创建线程的三种方式、线程运行原理、常见方法、线程状态

    文章目录 1.创建线程的三种方式 1.1 继承Thread类并重写run方法 1.2 使用Runnable配合Thread 1.3 通过Callable和FutureTask创建线程 2.Runnab ...

  7. 创建线程的三种方式及区别

    一:创建线程的三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable接口 二:创建线程的具体实现步骤: 1.继承Thread类 (1).先继承 Thread类,并且 ...

  8. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  9. Java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  10. java创建线程的两种方式及区别

    本文将介绍创建线程的两种方式,示例代码在下面,复制粘贴即可 继承Thread类方式和实现Runnable接口方式 区别:由于在开发的过程中,很多的类都会用到继承的方式,如果采用继承的方式会让各个类之间 ...

最新文章

  1. Centos7安装apt-get 在centos下用yum install xxx        不是使用apt-get
  2. html print 边距,css print
  3. python3cookbook_python3-cookbook读书笔记(四)
  4. java集合对字符串或对象去重
  5. chrome查看网站字符集编码的方法(不需要安装charset)
  6. sql exists和not exists用法
  7. 哪个服务器比较稳定,云服务器哪个比较稳定
  8. div模拟textarea在ios下不兼容的问题解决
  9. 测试连接数据库是否成功
  10. 关于Vista的AppInfo服务被禁的问题
  11. python 学生编程--3 多彩同心圆
  12. 概率dp(A - Scout YYF I POJ - 3744 )
  13. 简单的方法破解百度网盘上带密码的学习视频资源
  14. win7 Qt5.5安装Qwt 6.1.2
  15. unity可以直接转h5吗_Unity对H5小游戏开发的支持—Project Tiny
  16. 前端开发规范和开发文档的书写规范
  17. GrowingIO 数据采集 iOS SDK 测试实践
  18. 如何在 Git 中保存用户名和密码?
  19. 网络安全工程师的职业前景如何?
  20. 这里是一个有关KiTTY本地化程序 cnKiTTY的简单说明~~

热门文章

  1. 173.二叉搜索树迭代器
  2. sql分别对两列数据求和以不同的条件_利用数组与字典,实现双条件数据汇总的方法...
  3. CS231n Assignment1 Knn
  4. 天池客流预测–GBDT
  5. 【bug解决】You should consider upgrading via the 'pip install --upgrade pip' command.
  6. 关于Activity的四种启动模式详解
  7. 【Codeforces Round #544 (Div. 3)】K Balanced Teams【线性DP】
  8. 使用JSPanda扫描客户端原型污染漏洞
  9. 对短链接服务暴露的URL进行网络侦察
  10. 简单的docker下载安装jenkins