我们在网上可以看到所有有关于java的线程的基本概念的很多解释,不乏有很多详细经典的解释和代码解说。但是我们的很多初学者看完不能有一个直观的印象,特别是一些没有编程基础的学习者,很多时候要花很多时间去理解。我希望这篇文章能给初学者一个很直观,很容易理解的角度去学习。

一、java线程的生命周期

了解一个东西,要搞清楚它是怎么运作的。搞清楚内部的来龙去脉是一个学习极好的角度,而生命周期是一个很好的着手点。一个图来解释

我们只要了解上面图每一种状态的关系和相互转换就可以了,线程也就了解的一半了。

1.好,现在来看看线程开始,以new Thread()的方式诞生。

2.start()的方式进入线程的运行状态,当然线程没有直接进入运行状态,而是先进入了"可运行状态",即“就绪状态”,在调用了run()方法后才进入运行状态。好了,线程跑起来了。

(图中没有显示run()方法,当然你可以不用start(),直接使用run(),但是差别很大。Start方法让线程进入一个多线程的状态,特别是多个线程的时候,CPU会给每个线程标记,比如1号Thread、2号Thread. . . . . .如果你直接run()起来,CPU就不管你啦。不管你多少个有关于这个对象的线程,都是没有标记,就想一群脱缰的野马,控制不了。)

3.就像人一样,生命的开始和结束之间,我们除了在“奋斗”和“准备奋斗”的状态之外,另外一种状态是在休息。线程的“休息状态“就是“阻塞状态”,我们有很多种方法从“奋斗状态”转换到“休息状态”。而线程也一样,从“运行状态”到“阻塞状态”,即是wait()方法。那从“就绪状态”如何返回“运行状态”呢?对不起,不能直接到达“运行状态”,要先到“就绪状态”再到“运行状态”,而线程从“阻塞状态”到“就绪状态”使用notify()或者notifyAll()。

4.有时候我们不想去休息,只是想处于一种“暧昧”状态,可进可退。线程的“可运行状态”就是“暧昧状态”。线程如何从“运行状态”转换为“可运行状态”呢?方法很简单,sleep()和yield()。两者的区别是一个是可以定时,一个不可以。

5.然后线程进入了“可运行状态”后,如果有多个线程都想进入“运行状态”,CPU如何办?好办,java中可以给线程设置优先级,等级高就先执行罗。如果等级一样如何办?好办,公平竞争,谁厉害谁上罗(其实是随机吧,点到谁谁上)。

二、实现方式

我们了解了线程的生命历程,那我们如何创建他们呢?

  1. 实现Runnable接口
  2. 继承Thread父类

区别:这两个有什么区别

A:实现Runnable接口一个是可以摆脱java中单继承的困扰,继承Thread太单调。我们喜欢多多益善对嘛。

B:实现Runnable的优势,是多个线程共享这个对象的数据。如果是继承Thread,多个线程是各用各用的东西。

三、对象

Java中一切皆为对象。我们要线程干嘛?不就是为了来“搞对象”啦。于是我们在“搞对象”的过程中,就出现了一个问题。就一个对象,但是很多个线程都想搞它如何办?

为了协调这些线程的矛盾,java就又提出了一个关键字synchronized。这个synchronized很叼的,它就像一个裁判。有一个线程a想来用对象,如果里面有线程b。裁判就会对外面的线程a说:“对不起,里面有了线程b了。要等下,等线程b用完了对象才能让你进来”。所以很多代码要保证对象的唯一性,就要用到synchronized。

像“售票系统”,很多个客户端都来抢票,如何保证票不被多抢,导致票没了还有客户端再抢。

四、总结

本文没有代码介绍,网上已经有很多对于线程的介绍。希望读者在看完这篇文章后有一个对线程具体化的概念,在结合一个个知识点看看大神们的代码介绍就更为深刻。当然有错误的地方希望大家多多提醒。

java中多线程入门有趣介绍的更多相关文章

  1. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  2. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  3. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  4. java中多线程执行时,为何调用的是start()方法而不是run()方法

    Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...

  5. Java中多线程的使用(超级超级详细)线程池 7

    Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处: 1.降低消耗,减少 ...

  6. Java中多线程的使用(超级超级详细)线程安全原理解析 4

    Java中多线程的使用(超级超级详细)线程安全 4 什么是线程安全? 有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样 ...

  7. java中多线程中Runnable接口和Thread类介绍

    java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...

  8. Java中多线程原理详解

    Java是少数的集中支持多线程的语言之一,大多数的语言智能运行单独的一个程序块,无法同时运行不同的多个程序块,Java的多线程机制弥补了这个缺憾,它可以让不同的程序块一起运行,这样可以让程序运行更加顺 ...

  9. java中多线程详解-synchronized

    一.介绍 当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线 ...

随机推荐

  1. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法

    在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...

  2. vue-cli3.x 搭建项目目

    安装文档 https://cli.vuejs.org/zh/guide/ 安装条件 npm 更至最新 node >=8.9 可以用npm -v 查看npm的版本号 1.关于旧版本 Vue CLI ...

  3. POJ - 3279 Fliptile(反转---开关问题)

    题意:有一个M*N的网格,有黑有白,反转使全部变为白色,求最小反转步数情况下的每个格子的反转次数,若最小步数有多个,则输出字典序最小的情况.解不存在,输出IMPOSSIBLE. 分析: 1.枚举第一行 ...

  4. 2pc和3pc区别

    2pc和3pc区别 3pc背景:    2pc协议在协调者和执行者同时宕机时(协调者和执行者不同时宕机时,都能确定事务状态),选出协调者之后 无法确定事务状态,会等待宕机者恢复才会继续执行(无法利用定 ...

  5. html—表单控件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 一本通1402 Vigenère密码

    [题目描述]6世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南 ...

  7. Nacos快速开始

    Nacos是一个服务发现.配置管理和服务管理的组件. 说到服务注册与发现,我想到Eureka.Zookeeper 说到服务治理,我想到Dubbo 说到配置管理,我想到Apollo 作为后起之秀的Nac ...

  8. cafe-ssd數據集訓練

    训练方式::https://blog.csdn.net/xiao_lxl/article/details/79106837 caffe-ssd训练自己的数据集 https://blog.csdn.ne ...

  9. C#——发送邮件

    需要2个引用 using System.Net;using System.Net.Mail; using (MailMessage mailMessige=new MailMessage()) usi ...

  10. CENTOS YUM更新源

    网络yum源和制作本地光盘yum源 配置CENTOS YUM更新源 yum安装rpm包安装后本地不清除的方法 sed -i 's#keepcache=0#keepcache=1#g' /etc/yum ...