我们在网上可以看到所有有关于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. 吴裕雄--天生自然 JAVASCRIPT开发学习:比较 和 逻辑运算符

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

  2. 了解OOM

    1)什么是OOM? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError.看下关于的官方说明: Thrown when ...

  3. java 简单的冒泡

    import java.util.Arrays; public class mao { public static void main(String[] args) { int [] array={1 ...

  4. MySQL 表查询语句练习题

    MySQL 表查询语句练习题: 一.  设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表 ...

  5. VS程序不显示控制台

    之所以会有这样的想法是因为,有时候我会用到一些库,这些库在使用的时候会在控制台输出一些信息,虽然这是无可厚非的事情,但是,如果我写了一个界面,这个时候当然是希望要显示什么就显示在界面上,或者就不要显示 ...

  6. 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL

    在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...

  7. maven解决大项目打包慢的问题

    裁剪反应堆 -am, --also-make 同时构建所列模块的依赖模块.必须和-pl同时使用.如 mvn -pl test  install -am ,将同时构建test的依赖模块. -amd, - ...

  8. Thread--生产者消费者假死分析

    package p_c_allWait; public class ValueObject { public static String value = ""; } package ...

  9. Vue.js——5.生命周期

    Vue的生命周期 创建阶段new Vue1,beforeCreate() 表示在实例没有被创建出来之前会执行它加载data和methods2,caeated() data 和methods被初始化了 ...

  10. AES加密中遇到的坑

    项目背景: 终端数据需要上传到后台,为了安全,使用了AES加密 问题1: 数据首先经过了protobuf进行格式,数据传输到后台无法解析 解决:二进制数据直接进行AES加密后大多无法正常解析,于是在加 ...