我们在网上可以看到所有有关于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. VS2013 MFC opencv 播放视频

    看网上有很多人用的还是CvvImage类,但是Opencv3.0已经没有CvvImage这个类了.百度得之可以使用以前的类,稍作修改就可以了. 头文件: #pragma once #ifndef CV ...

  2. 线上环境 分析java问题 常见命令

    在生产上进程需要分析jvm运行情况,今天分享几个自己常用的命令,持续更新,欢迎补充 1.jps jstack -l {pid} > jstack.log #查看线程快照信息 2.jps jmap ...

  3. 使用mysql的注意事项

    1,文件导入:LOAD DATA INFILE '/tmp/pet.txt' INTO TABLE pet FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ...

  4. UVM实战[一]

    一个新的连载系列,将以一个实际的UVM环境代码讲解的使用.机制等,更新周期会比较长. 文件说明 分享的文件是我个人和同学在参加复微杯大学生电子设计大赛中所完成的设计.赛题来自数字命题AI赛道,有兴趣可 ...

  5. import datetime

    import datetimenow = datetime.datetime.now()print('当前时间:',now) 当前时间: 2019-11-21 11:11:58.093122

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习:DOM EventListener

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

  7. ZJNU 2340/2341/2343 - 罗小黑的“礼物”Ⅰ/Ⅱ/Ⅲ

    把一位数.两位数.三位数……这些所在的范围分开判断 可得1~9这些数范围在[1,9]内 10~99内共有90个数,每个数占两位,所以共有180位在,范围在[10,189]内 同理,100~999内共有 ...

  8. 移动端— Touch事件轮播图

    虽然 以前也写过手机端页面 .当时用的jquery moblie 框架.啥也不懂 就知道复制粘贴出效果 不敢改内部样式.现在呢  了解手机端原理 一些基本的概念 视口 缩放 后 .再去想以前写的页面  ...

  9. docker安装fastdfs与java客户端测试

    一.docker 安装FastDFS 1.拉取镜像 docker pull morunchang/fastdfs 2.创建并启动tracker容器 docker run -d --name=track ...

  10. Python笔记_第四篇_高阶编程_反射_(getattr,setattr,deattr,hasattr)

    1. 元数据和反射概念: 有关程序及其类型的数据成为元数据(metadata),他保存在程序的程序集中. 反射这个词儿听起来比较陌生.程序在运行时,可以查看其它程序集或其本身的元数据.一个运行的程序查 ...