为什么80%的码农都做不了架构师?>>>   

1.概要

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。本节,我们将探讨常用的实现多线程的2种方式:Thread和Runnable。至于第三种ExecutorService、Callable、Future的实现是属于java.util.concurrent包下的内容,我将单独设置一节去探讨。

2.Runnable简介

2.1 Runnable概述

Runnable是一个接口,该接口只包含了一个run无参方法。设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread类实现了Runnable。激活的意思是说某个线程已经启动并且尚未停止。

此外Runnable为非Thread子类的类提供了一种激活方式。通过实例化某个Thread实例并将自身作为运行目标,就可以运行实现Runnable的类而无须创建Thread的子类。大多数情况下,如果只想重写run()方法,而不重写其他Thread方法,那么应使用Runnable接口。这很重要,因为除非程序猿打算修改或增强类的基本行为,否则不应该创建子类。

2.2 Runnable源码

package java.lang;public interface Runnable {public abstract void run();
}

3.Thread简介

3.1 Thread概述

Thread是程序中的执行线程。Java虚拟机允许程序并发地运行多个执行线程。

Thread是一个类。它实现了Runnable接口。

3.2 Thread类声明

public class Thread implements Runnable {}

4.Thread和Runnable的区别

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,

首先阐述实现Runnable的好处:

  • Java不允许多继承,因此实现了Runnable接口的类可以再继承其他类
  • 方便资源贡献,即可以共享一个对象实例。

其次,Thread实现多线程方式是:多个线程完成自己的任务。而Runnable实现多线程的方式是:多个线程共同完成一个任务。这是因为Thread(线程)已经是程序中的执行线程了。

5.Thread和Runnable的多线程示例

该示例也能看出Thread和Runnable实现多线程的区别

5.1Thread的多线程示例

package org.multithread.basic.realize;public class TestThread {public static void main(String[] args) {MyThread t1 = new TestThread().new MyThread();MyThread t2 = new TestThread().new MyThread();MyThread t3 = new TestThread().new MyThread();t1.start();t2.start();t3.start();}class MyThread extends Thread{private int ticket =10;@Overridepublic void run() {for(int i = 0;i<5;i++){if(this.ticket > 0){System.out.println(this.getName()+"出售:ticket"+this.ticket--);}}}};
}

运行结果:

Thread-0出售:ticket10
Thread-2出售:ticket10
Thread-1出售:ticket10
Thread-2出售:ticket9
Thread-0出售:ticket9
Thread-0出售:ticket8
Thread-0出售:ticket7
Thread-0出售:ticket6
Thread-2出售:ticket8
Thread-1出售:ticket9
Thread-1出售:ticket8
Thread-1出售:ticket7
Thread-1出售:ticket6
Thread-2出售:ticket7
Thread-2出售:ticket6

结果说明:

  • MyThread继承于Thread,它是自定义线程,每个MyThread都会出售5张ticket。
  • 线程执行时乱序

5.2 Runnable的多线程示例

对上个程序进行改造,如下:

package org.multithread.basic.realize;public class TestThread {public static void main(String[] args) {
//      MyThread t1 = new TestThread().new MyThread();
//      MyThread t2 = new TestThread().new MyThread();
//      MyThread t3 = new TestThread().new MyThread();MyRunnable mr = new TestThread().new MyRunnable();Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);Thread t3 = new Thread(mr);t1.start();t2.start();t3.start();}class MyThread extends Thread{private int ticket =10;@Overridepublic void run() {for(int i = 0;i<5;i++){if(this.ticket > 0){System.out.println(this.getName()+"出售:ticket"+this.ticket--);}}}};class MyRunnable implements Runnable{private int ticket = 10;@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0;i<5;i++){if(this.ticket > 0){System.out.println(Thread.currentThread().getName()+"出售:ticket"+this.ticket--);}}}};
}

运行结果:

Thread-1出售:ticket10
Thread-1出售:ticket7
Thread-1出售:ticket6
Thread-2出售:ticket8
Thread-2出售:ticket4
Thread-2出售:ticket3
Thread-2出售:ticket2
Thread-2出售:ticket1
Thread-0出售:ticket9
Thread-1出售:ticket5

结果说明:

  • 主线程创建并启动了3个子线程,而且这3个子线程都是基于mr这个Runnable对象创建。
  • 这3个子线程一共卖出了10张ticket。这说明3个子线程资源共享

6 总结

通过以上学习,我们了解到实现多线程的两种方式:继承Thread和实现Runnable接口,但是记住一条:在多线程开发中,要以实现Runnable接口为主,这是因为Java是单根继承,可以多个实现,继承Thread的类不能再继承其他类。并且Thread是执行线程,每个子线程之间相互独立,资源不共享。

转载于:https://my.oschina.net/mrku/blog/748445

Java多线程基础篇(02)-多线程的实现相关推荐

  1. Java面试基础篇之集合

    文章目录 你知道的集合都有哪些? 哪些集合是线程安全的? Collection 集合类和数组有什么不同? Collection和Collections有什么区别? 如何确保一个集合不能被修改? Lis ...

  2. JAVA多线程基础篇-关键字synchronized

    1.概述 syncronized是JAVA多线程开发中一个重要的知识点,涉及到多线程开发,多多少少都使用过.那么syncronized底层是如何实现的?为什么加了它就能实现资源串行访问?本文将基于上述 ...

  3. Java核心类库篇7——多线程

    Java核心类库篇7--多线程 1.程序.进程和线程 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件 进程 - 主要指运行在内存中的可执行文件 线程就是进程内部的程序流 操作系统内部支持 ...

  4. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...

    本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...

  5. java实现linkstring,【JAVA SE基础篇】32.String类入门

    [JAVA SE基础篇]32.String类入门 1.字符串 1.String类又称作不可变字符序列 2.String位于java.lang包中,java程序默认导入java.lang包下所有的类 3 ...

  6. python深浅拷贝 面试_Python面试宝典之基础篇-02

    原标题:Python面试宝典之基础篇-02 我觉得你如果正在找工作,我的Python面试宝典几期教程,你一定得花时间看完了! 题目006:说说Python中的浅拷贝和深拷贝. 点评:这个题目本身出现的 ...

  7. java预科基础篇2021.2.3学习记录

    java预科基础篇2021.2.3学习记录 初识博客 本以为老师会讲是在微博上写博客做记录,没想到会是很多程序员专用的博客 博客为音译,正确翻译结果为网络日记,英文为bog 较为专业的程序员用博客为: ...

  8. java se运算符优先级,【JAVA SE基础篇】10.运算符优先级与类型转换

    [JAVA SE基础篇]10.运算符优先级与类型转换 1.运算符的优先级 运算符的优先级在考试中会考,了解即可,多用就会熟能生巧 实际使用过程中建议用小括号来分优先级 关键就是:逻辑非>逻辑与& ...

  9. Java - ip2region - 基础篇(你知道ip2region吗?)

    Java - ip2region - 基础篇(你知道ip2region吗?) 本篇主要介绍 ip2region, ip2region 支持很多客户端,本次主要以Java来介绍 在进行系统开发时,我们一 ...

  10. JAVA红石_【Mc我的世界红石研究日记】第四期:红石基础元件(四)——JAVA版基础篇...

    Hello,大家好,欢迎来到Mc元气工作室!本期给大家带来Mc我的世界红石研究日记·第四期!版本:JAVA1.14.3. 第三期答题互动答案 以下哪一个选项被红石比较器检测出的红石信号与其他三项不同? ...

最新文章

  1. 学计算机的好处处300字,学计算机的心得体会300字
  2. 数字图象处理之二维码图像提取算法(九)
  3. fastdfs php client,centos 5.7_64位下FastDFS_client的配置和PHP测试
  4. vue-cli打包遇到的问题
  5. RDS最佳实践(三)—如何制定相关的流程来规范RDS的使用
  6. 网络:http请求之几种常见技术
  7. 破云里步重华为什么说自己姓薛_都说虎毒不食子,但猫咪为什么会吃掉自己的孩子呢...
  8. 避免在Cassandra中使用清单
  9. 真机x86 android分辨率,Android-x86入门之--启动参数设置
  10. 汇编分析golang循环
  11. 【Flink】flink highavailabilityservices 源码解析
  12. Struts(十四):通用标签-form表单
  13. JavaScript学习(二十六)—事件处理程序的添加与删除
  14. amd自定义分辨率_Intel首款独显性能走光:AMD/NVIDIA芒刺在背
  15. pip3 install -U qcloud-python-sts 安装失败解决方法
  16. Activiti7工作流引擎介绍
  17. 基于python的智能家居系统_基于MicroPython的智能家居实验平台设计
  18. 逆转ISP,港科大陈启峰团队提出了可逆ISP
  19. 全国大学生软件测试大赛Web应用大赛常用测试语句
  20. chmod授权sh文件执行权限

热门文章

  1. cnn神经网络_神经网络之CNN和RNN
  2. c语言输入成绩求不及格,输入一个学生信息,可以输出,不及格那个输出狗后会有程序停止运行...
  3. php 窗体移动,窗体处理 - My Labs! PHP - PHP博客
  4. mysql主从安装配置_mysql主从安装配置
  5. java 心跳程序_Java实现心跳机制的方法
  6. thinkphp5 mysql助手_ThinkPHP5-数据库基本操作
  7. java中set怎么建int型_使用Array.setInt来填充Java中的数组
  8. Git、Github、Gitlab、Gitee、Git-ce的区别
  9. 安卓学习笔记04:安卓平台架构
  10. 如何在电话中交谈_11