线程的创建和启动
java使用Thread类代表线程,所有的线程对象都必须是Thread类或者其子类的实例。
java创建线程有三种方法:

一:继承Thread类创建线程类
通过Thread类来创建并启动多线程的步骤如下

  1. 定义Therad类的子类,并重写该类的Thread方法,该run()方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体;
  2. 创建Thread子类的实例,即创建线程对象; 3) 调用线程的start()方法来启动该线程;
    start()方法的作用:启动一个分支线程,在JVM中开辟一个新的空间,并执行这个方法瞬间就结束了,这个方法的作用是为了开启一个新栈空间,只要新的栈空间开发出来,start()方法就结束了,线程启动成功,启动成功的线程会自动调用run()方法,并且run()方法,在分支栈的栈底部,
public class createThread extends Thread{private int i;//重写run()方法,run()方法体就是多线程执行体public void run(){//这段程序运行在分支栈中for (int j = 0; j < 100; j++) {System.out.println("分支栈——,》"+j+ getName());}}//这是mai'n方法,这里的代码在主线程中运行,属于主线程public static void main(String[] args) {//新建一个分支线程对象createThread ct=new createThread();//启动线程ct.start();//这里的代码还是在主线程中运行for (int i = 0; i < 1000; i++) {System.out.println(Thread.currentThread());}}
}

二:实现Runnable接口创建线程类
实现Runnable接口创建线程类的步骤如下:

  1. 定义Runnable接口的实现类,并重写该接口中的run()方法,run()方法时该线程的执行体。
  2. 创建Runnable实现类的实例,并以此作为Thread的target构造方法来创建Thread对象,该Thread方法才是真正的线程类。
  3. 调用线程对象的start()方法来启动线程
public class createRunnabe implements Runnable {public static void main(String[] args) {/* //创建一个可以运行的对象;createRunnabe cr=new createRunnabe();//将可运行的对象封装成一个线程对象Thread thread=new Thread(cr);//启动线程*/Thread thread=new Thread(new createRunnabe());  //合并代码thread.start();for (int i = 0; i <100 ; i++) {System.out.println("主线程--》"+i);}}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("分支线程-->"+i);}}
}

注意:
Runnable对象仅仅作为Thread对象的Target,Runnable实现类里包含的run()方法仅仅作为线程的执行体,而实际上线程对象依旧是Thread实例,所以该Thread线程负责执行其target的run()方法。

三:使用接口Callable和接口Future创建线程
Callable接口提供了一个call()方法作为线程的执行体,但是call()方法比run()方法功能更强大。
 Call方法有返回值;
 Call方法可以声明抛出的异常;

因此可以提供一个Callable接口的实现类作为Thread的target,代替runnable接口的run()执行体,但是Callable接口是java5的特性,不是Runnable接口的子接口,所以Callable接口不能直接作为Thread的target.
java5提供了Futuru接口来代表Callable接口里的Call()方法的返回值,并为Future接口提供了一个实现类FutureTask,该实现类实现了FutureTask实现了Future接口,并实现了Callable接口的实现类—可以作为Thread类的target.

创建并启动有返回值的线程的步骤:

  1. 创建Callable接口的实现类,并实现Call()方法,该call()方法将作为线程执行体,且该Call()方法有返回值,在创建Callable实现类的实例,这里使用匿名内部类实现Callable接口,也可以使用Lambda表达式实现接口。(应为Callable接口是函数式接口所以可以使用Lambda表达式来创建Callable对象)
  2. 使用FutureTast类来包装Callable对象,该FutureTusk对象封装了Callable对象的Call()方法的返回值。
  3. 使用FutureTask对象作为Thread对象的target创建并启动新线程。
public class ThirdThread {public static void main(String[] args) {/*FutureTask(Callable<V> callable)创建一个 FutureTask会在运行,执行给定的 Callable。*///采用匿名内部类来实现Callable接口中的call()方法FutureTask futuretask = new FutureTask(new Callable(){@Overridepublic Object call() throws Exception {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + " :" + i);}//call方法可以有返回值return this;}});Thread thread=new Thread(futuretask);//启动分支此线程,实质上是以Callable接口来创建并启动线程thread.start();for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+": "+i);}}
}

创建线程的三种方式对比
通过继承Thread类,实现Runnable,实现Callable接口都可以实现多线程,不过实现Runnable接口和实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明并抛出异常。因此这两种实现接口的方式差不多:

实现接口的方式和继承Thread类的主要差别:

优势:

 线程实现了Callable、Runnable接口还可以继承其他类,提高了程序的扩展性。
 实现接口的情况下,多个线程可以共享一个target对象非常适合于多个线程来处理同一份资源,从而可以将CPU代码、数据分开,形成清晰的模型.

劣势:

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

java线程的创建和启动深度解析相关推荐

  1. Java线程:创建与启动

    Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runna ...

  2. Java的知识点25——程序、进程与线程 || 线程的创建和启动

    程序.进程与线程 进程的特点:动态性.并发性.独立性 并发和并行的区别 并发:多个CPU同时执行多个任务 并行:一个CPU(采用时间片)同时执行多个任务 注:很多多线程是模拟出来的,真正的多线程是指有 ...

  3. java线程 创建与启动_浅析Java中线程的创建和启动

    前言 线程是一个程序内部的顺序控制流.cpu实际上在一个时间点上,只执行一个.只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是多个线程.就像你的时间分成几片,这样整体看来做事情有规律, ...

  4. 线程的创建与启动——Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable)||多线程运行结果是随机的

    线程的创建与启动 在 Java 中,创建一个线程就是创建一个 Thread 类(子类)的对象(实例). Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable).对应 ...

  5. java多线程的创建和启动

    java读取文件的操作(字符流) 文章目录 多线程 线程 Thread 线程的创建和启动 线程创建两种方式的区别 多线程 线程 进程是应用程序的执行示例,有独立的内存空间和系统资源. 线程是CPU调度 ...

  6. python 中主线程结束 子线程还在运行么_python 线程之一:线程的创建、启动及运行方式

    threading:这个模块在较低级的模块 _thread 基础上建立较高级的线程接口 以后我们就用 threading 模块来管理线程就可以了. Tread 类:控制线程创建.启动及运行方式 一.线 ...

  7. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

  8. 多线程编程(2): 线程的创建、启动、挂起和退出

    python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...

  9. java runnable 启动_Java多线程:线程的创建与启动

    # 面试题: Java中创建线程有几种方式. 不同的创建方式有什么区别. 如何启动一个线程. # Java中创建线程的方式 JDK源码中的描述:两种 image.png 第一种是继承Thread类,重 ...

最新文章

  1. jmeter mysql plugin_安装一个jmeter的插件--实现监控事务响应时间、tps等功能
  2. 如何造出逼真图像?南洋理工Zheng博士论文《基于深度生成学习的逼真图像合成》197页pdf阐述视觉合成工作...
  3. python3下关于copy和deepcopy中的区别
  4. 超级队长VR线下体验店落地上海,让娱乐突破想象
  5. 算法---Lru缓存(Java)
  6. 喜讯丨神策数据四大客户案例斩获大数据“星河”案例
  7. w3m linux,Linux 终端浏览器 w3m
  8. 文件到集合改进版【应用】
  9. 算法复杂度为O(N) 的排序算法
  10. python .py文件变为.so文件进行加密
  11. WebSocket 对象简介
  12. python操作excel的读写
  13. ALPHACAM Desinger 2020.0中文破解版 64位
  14. microbiomeViz:绘制lefse结果中Cladogram
  15. NLP入门(十)使用LSTM进行文本情感分析
  16. 小学期 BlueSky学长与友人帐
  17. MySQL - Emoji 表情包编码
  18. 云服务器+花生壳+xming+vscode环境搭建(云服务器运行程序,本地进行GUI显示)
  19. 菜鸟学人工神经网络(C++11实现)零:矩阵类
  20. 微软量子论文撤稿,谷歌“量子霸权”受质疑,量子计算的狂热需一盆冷水清静

热门文章

  1. 如何保护企业网络免受DDoS攻击?—Vecloud微云
  2. PHP实现四种基本排序算法
  3. 一本通1627【例 3】最大公约数
  4. web自动化测试---概述
  5. centos7.3上yum install nodejs
  6. 三步搞定 opencv 初始环境设定
  7. 瑞士银行开户条件有哪些,瑞士银行开户的流程及注意事项是什么?
  8. C#编程语言之读取网页内容(微软官网方法)
  9. SLAM:现在,未来和鲁棒感知时代
  10. for vue 一行2列_vue常见面试题汇总