线程概述

利用多线程技术可以使系统同时运行多个程序块,缩短出程序响应的时间,提高计算机资源的利用率,达到多任务处理的目的。

进程和线程

进程是程序的一次动态执行过程,每个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程(比如浏览器可以开多个窗口,每个窗口就是一个进程)

多进程操作系统能够运行多个进程,每个进程都能够循环利用所需要的CPU时间片,使得所有进程看上去像在同时运行一样。

线程是进程的一个执行流程,一个进程可以由多个线程组成,也就是一个进程可以同时运行多个不同的线程,每个线程完成不同的任务。

线程的并发运行:就是一个进程内若干个线程同时运行。(比如:word的拼写检查功能和首字母自动大写功能是word进程中的线程)

线程进程的关系是一个局部整体的关系,每个进程都由操作系统分配独立的内存地址空间,而同一进程的所有线程都在同一地址空间工作。

线程的生命周期

一个线程的完整生命周期要经历5种状态:新建、就绪、运行、阻塞、死亡

新建状态:使用new和某种线程的构造方法来创建线程对象,该线程就会进入新建状态,系统为该线程对象分配内存空间。处于新建状态的线程可以通过调用**start()**方法进入就绪状态。

就绪状态:此时线程已经具备了运行的条件,进入了线程队列,等待系统分配CPU资源,一旦获得CPU资源,该线程就会进入运行状态。

运行状态:进入运行在状态,线程会执行自己的**run()**方法中的代码。

阻塞状态:一个正在执行的线程,如果执行了suspend、join或sleep方法,或等待io设备的使用权,那么该线程将会让出自己的CUP控制权并暂时中止自己的执行,进入阻塞状态。阻塞的线程,不能够进入就绪队列,只有当阻塞原因被消除的时候,线程才能进入就绪状态,重新进入线程队列中排队等待CPU资源,然后继续执行。

死亡状态:一个线程完成了全部工作或者被提前强制性的终止,该线程就处于死亡状态。

线程常用方法归纳

多线程的实现方法

案例

1、继承Thread类,重写run方法来实现多线程

public class MyThread extends Thread{    private String name;//线程名    public MyThread() {    }    public MyThread(String name) {        this.name = name;    }        //完成线程功能的主体代码都在run()方法中    @Override    public void run() {        for (int i = 0; i < 3; i++){            System.out.println(name + "执行功能" + i);        }    }}
public class ThreadDemo {    public static void main(String[] args) {        //定义线程        MyThread thread1 = new MyThread("线程A");        MyThread thread2 = new MyThread("线程B");        MyThread thread3 = new MyThread("线程C");        MyThread thread4 = new MyThread("线程D");        MyThread thread5 = new MyThread("线程E");        MyThread thread6 = new MyThread("线程F");        //调用start()方法启动线程,让其进入就绪状态,等待系统分配CPU资源进入运行状态调用run()方法        thread1.start();        thread2.start();        thread3.start();        thread4.start();        thread5.start();        thread6.start();    }}

运行结果:(基于4核计算机)
运行三个线程(顺序执行)

运行6个线程(交互执行)

2、继承Runnable接口实现多线程

重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

class MyRunnable implements Runnable {    @Override    public void run() {        for(int i = 0; i < 3; i++){            System.out.println(Thread.currentThread().getName()+"运行功能"+i);        }    }}public class RunnableDemo {    public static void main(String[] args) {        //定义线程        MyRunnable mt1 = new MyRunnable();        MyRunnable mt2 = new MyRunnable();        MyRunnable mt3 = new MyRunnable();        MyRunnable mt4 = new MyRunnable();        MyRunnable mt5 = new MyRunnable();        MyRunnable mt6 = new MyRunnable();        //利用Runnable接口子类对象来实例化Thread对象        Thread thrad1 = new Thread(mt1,"线程1");        Thread thrad2 = new Thread(mt2,"线程2");        Thread thrad3 = new Thread(mt3,"线程3");        Thread thrad4 = new Thread(mt4,"线程4");        Thread thrad5 = new Thread(mt5,"线程5");        Thread thrad6 = new Thread(mt6,"线程6");        //启动线程        thrad1.start();        thrad2.start();        thrad3.start();        thrad4.start();        thrad5.start();        thrad6.start();    }}

运行结果:

继承Thread类和实现Runnable接口完成多线程的区别

  • 实现Runnable接口可以做到资源共享,而继承Thread类不行(比如购票问题)
  • 实现Runnable接口相比继承Thread类来说,具有两大优势:避免单继承带来的局限和可以共享资源等优势
  • 相比Thread类的继承,一般采用实现Runnable接口来实现多线程

3、通过Callable 和 FutureTask创建线程

3.1 创建Callable接口的实现类 ,实现它的Call方法3.2 使用FutureTask类来包装Callable对象,这个FutureTask对象需要封装Callable对象的Call方法的返回值3.3 使用FutureTask对象作为Thread对象的target创建并调用start方法启动线程

//1. 创建Callable接口的实现类 ,实现它的Call方法class MyCallable implements Callable{    //重写Callable的call方法    @Override    public T call() throws Exception {        System.out.println(Thread.currentThread().getName() + "   ---->通过实现Callable接口来实现线程");        return null;    }}public class Callable_FutureTask {    public static void main(String[] args) {        //2. 实例化Callable对象        Callable callable = new MyCallable();        //3. 使用FutureTask类来包装Callable对象        FutureTask futureTask = new FutureTask(callable);        //使用FutureTask对象作为Thread对象的target创建并调用start方法启动线程        Thread thread1 = new Thread((futureTask),"线程A");        System.out.println("当前运行线程名:" + Thread.currentThread().getName());        //启动线程        thread1.start();    }}

运行结果:

4、通过线程池实现多线程

class MyRunnable implements Runnable{    @Override    public void run()    {        System.out.println("通过线程池的方式创建的线程,线程名 :" + Thread.currentThread().getName());    }}public class ThreadPool {    //设置线程池的数量    private static int threadPoolNum = 8;    public static void main(String[] args) {        ExecutorService executorService = Executors.newFixedThreadPool(5);        for(int i = 0; i < threadPoolNum; i ++)        {            //创建线程对象            MyRunnable thread = new MyRunnable();            //Thread.sleep(1000);//使线程休眠1秒            executorService.execute(thread);        }    }}

运行结果:

关于线程注意事项

  1. Java中,所有线程都是同时启动的,哪个线程占有CPU等运行资源,哪个线程就可以运行。
  2. Java程序每次运行都需要启动两个线程(main线程和垃圾收集器线程)
  3. Java线程运行过程中,其他线程并不会随着主线程的结束而结束。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

word是多线程的程序_线程的基本概念,实现多线程的四种基本方式相关推荐

  1. java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

    java8多线程运行程序 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之 ...

  2. 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式

    多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...

  3. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式

    IT外包服务主要分为IT运维外包和软件开发外包,对于软件开发外包主要偏于研发类型,在本文中主要讨论IT运维外包. 上海蓝盟认为,IT运维外包主要包含IT服务外包.IT采购.弱电工程.系统集成和云服务等 ...

  4. java的rest教程_[Java教程]SpringMVC的REST风格的四种请求方式

    [Java教程]SpringMVC的REST风格的四种请求方式 0 2017-08-28 22:00:25 一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ...

  5. android 多线程间通信,android实现线程间通信的四种常见方式

    1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递conten ...

  6. 线程池概念、线程池作用、线程池的四种创建方式

    线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...

  7. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

  8. 多线程面试题_线程魔术技巧:使用Java线程可以做的5件事

    多线程面试题 Java线程最鲜为人知的事实和用例是什么? 有些人喜欢爬山,有些人喜欢跳伞. 我,我喜欢Java. 我喜欢它的一件事是,您永不停止学习. 您每天使用的工具通常可以为您带来全新的面貌,以及 ...

  9. 多线程 环形缓冲区_使用环形缓冲区有效登录多线程应用程序

    "有两种编写无错误程序的方法:只有第三种有效." -艾伦·J·佩利斯 在关键计算机应用程序的生命周期中,日志记录是非常重要的活动,尤其是在故障症状不明显时. 日志记录提供了故障之前 ...

  10. java 多线程的好处_线程多有什么好处?使用多线程的优势

    线程多有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制. 多线程指从软件或者硬件上实现多个 ...

最新文章

  1. 基于asp.net2.0中membership系统角色、用户、资源的权限设计
  2. java双等号比较字符串,Java与两个字符串==比较是错误的?
  3. IE弹出窗口显示URL地址栏
  4. HTML中的全局属性
  5. Zabbix3.2安装
  6. Photon服务器引擎入门
  7. SQL:字符串拼接中换行处理
  8. Wince6.0应用开发:二、模拟器的使用
  9. react-countup 电子表数字样式 定时滚动 大屏需要 炫酷
  10. 从TextBox的升级看VB6与VB2010的不同~
  11. Astar算法的Java实现 (其他很多都是错的,没有计入曼哈顿值的代价)
  12. 标准电阻阻值速查表及由来
  13. 实验三 直流扫描分析
  14. 机器学习(聚类七)——层次聚类的优化算法
  15. 微软官方简体中文版Vs2008与MSDN下载
  16. Construct2 ——— 零基础也能自己做游戏
  17. 怎样规划自己的研究生生活?
  18. 深度分析数据库的热点块问题
  19. [2017.02.06] 阅读《Effective Morden C++》
  20. 产品开发中如何衡量产品价值,来做优先级排序?

热门文章

  1. 傅立叶变换的深入理解(转帖)
  2. 全球CT影像20秒诊断,阿里云为新冠AI辅助诊断系统加速 | 凌云时刻
  3. 如何写出优秀的开源简历
  4. mysql select trim_mysql trim函数用法举例
  5. 【飞行器】基于matlab多源信息融合算法多旋翼无人机组合导航系统【含Matlab源码 1267期】
  6. ai人工智能的本质和未来_人工智能简介:这就是未来
  7. ai人工智能对话了_产品制造商如何缓解对话式AI中的偏见
  8. 深度之眼 alexnet_AlexNet带给了深度学习的世界
  9. linux汇编section标签,Linux内核中常用的汇编
  10. 常用滤波算法(转载)