目录

一、引言

二、多进程与多线程

三、实现方法

1、继承Thread接口

2、实现runnable接口,传入Thread运行

3、注意

四、生命周期

五、总结


一、引言

之前多线程了解的基本是皮毛,后来是因为对javaweb中tomcat接受请求,用户并发访问如何使用多线程不太清楚,所以又重新把多线程拾了起来,发现了一片新大陆。

好多地方用到了多线程,使用同步以保证数据安全:collection中vector与arraylist线程安全,数据库中的读写锁互斥,消息队列中take与put的安全性,tomcat服务访问等等。

列了个大纲,写了下这一些列博客的内容梳理

二、多进程与多线程

一个进程对应一个应用程序。例如:在 windows 操作系统启动 Word 就表示启动了一个 进程。在 java 的开发环境下启动 JVM,就表示启动了一个进程。多进程的作用不是提高执行速度,而是提高 CPU 的使用率。

线程是一个进程中的执行场景,一个进程可以启动多个线程,线程之间共享java堆和方法区,不共享java栈。多线程不是为了提高执行速度,而是提高应用程序的使用率。

三、实现方法

首先介绍实现方法,这个是最直观的认识

1、继承Thread接口

public class Test {public  static  void main(String [] args){MyThread myThread=new MyThread();myThread.start();}
}
class MyThread extends Thread
{@Overridepublic void run() {while(true){try {Thread.sleep(1000);//该线程休息1秒钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程——"+ Thread.currentThread().getName());}}
}

2、实现runnable接口,传入Thread运行

package com.thread;public class Test {public  static  void main(String [] args){new Thread(new Runnable() {public void run() {while(true){try {Thread.sleep(1000);//该线程休息1秒钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程——"+ Thread.currentThread().getName());}}}).start();}
}

这个是匿名内部类的形式把Runnable对象传入Thread的构造函数当中。

3、注意

其实还有callable方法,可以返回值以后再慢慢讲。这里我们必须调用Thread的start()方法,这样才能通过jvm开启一个多线程,直接调用Thread的run()方法只是调用一个简单点的函数。

还有个比较经典的问题,下面的程序输出什么(即在runnable中实现run方法,又在Thread中实现run方法,多线程会调用哪一个)

public class Test {public  static  void main(String [] args){new Thread(new Runnable() {public void run() {while(true){try {Thread.sleep(1000);//该线程休息1秒钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程111——"+ Thread.currentThread().getName());}}}){public void run() {while(true){try {Thread.sleep(1000);//该线程休息1秒钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程222——"+ Thread.currentThread().getName());}}}.start();}
}

答案是Thread中的run方法,因为Thread类中run方法如下,target是传入的runnable对象,如果传入了runnable对象,就会执行runnable的run方法,但是现在Thread类中的run方法被继承,父类的run方法失效自然就不执行target.run方法,只会执行我们写好的继承类中的run方法。

    @Overridepublic void run() {if (target != null) {target.run();}}

四、生命周期

一个线程和vue、activity、servlet一样也有自己生命周期,了解生命周期可以使我们更好的理解多线程。

新建状态:使用关键字new创建线程后,线程处于等待状态,等待start;

就绪状态:线程执行start,线程排入就绪队列,等待jvm调度器调度;

运行状态:当线程抢到cpu资源,执行run方法,这时可以进入阻塞、就绪、和死亡任意一个状态;

死亡状态:线程完成任务或者stop/interrupt,线程结束进入死亡状态;

阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

  • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

  • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

  • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

五、总结

  • 多进程与多线程
  • 实现方法
  • 生命周期

Java多线程(一)——多线程实现方法和生命周期相关推荐

  1. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

  2. Java中的垃圾回收与对象生命周期

    转载自   Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...

  3. Java并发编程|第二篇:线程生命周期

    文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...

  4. Vue 的属性、方法和生命周期

    实例 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8&qu ...

  5. Java多线程(3)--线程的生命周期

    JDK中用Thread.State类定义了线程的五种状态 要想实现多线程,必须在主线程中创建新的线程对象.Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如 ...

  6. java多线程笔记补充之线程的生命周期

    多线程通信的时候很容易造成死锁,死锁无法解决,只能避免: 当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁. ...

  7. java中线程调度遵循的原则_Java 多线程(三) 线程的生命周期及优先级

    线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处 ...

  8. Java20-day11【实现多线程(进程、线程-调度-控制-生命周期)、线程同步(同步代码块、线程安全、Lock)、生产者消费者(模式概述、案例)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

  9. 《Java 高并发》03 线程的生命周期

    相关概念 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程. 一个进程是一个独立的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个 ...

最新文章

  1. XFS 文件系统 (一) :设计概览
  2. Fedora 8中驱动ASUS6摄像头
  3. 深入Python(5):random与range
  4. xml-rpc 以及 xml-rpc 在asp.net中的实现
  5. 在类中调用delete this问题
  6. 厂办大集体改制不签字_许昌二印,磨砂技术被外国觊觎,老工人说烂在肚子里也不外漏...
  7. 私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027
  8. maven基础--IDEA集成
  9. 交际过程的两个基本环节_要客品味 | 人际交往礼仪——交际礼仪的基本原则
  10. Android Studio - 安装插件GsonFormat
  11. Android编译libjpeg-turbo so高效压缩图片
  12. 关于Sentaurus的日常(二)(Carrier Transport Models)
  13. 洛谷P1640 [SCOI2010]连续攻击游戏(二分图)
  14. 信息安全意识分享—社会工程学
  15. python3的open函数中newline_newline不适用于python 2.7
  16. wine下微信中文乱码修订
  17. 电脑连打印机不打印,是怎么回事?
  18. K8S 数据卷volumes之ConfigMap
  19. 【北航数模】21中青杯 B题 港珠澳大桥桥梁设计与安全策略 A题汽车组装车间流水线问题
  20. 大学生网页作业之-个人主页、校园网站

热门文章

  1. MTK:屏幕模板机制
  2. java图书馆库存管理系统_书店图书库存管理系统.doc
  3. java multiple_Java Math multipleExact()使用方法和实例
  4. python 拼音识别_Python_语音合成
  5. c++简单的加法函数
  6. 模型相关:SolidWorks创建Cube模型,在3DMax中给不同面添加不同颜色,导出自带纹理的FBX至Unity
  7. 技术分享连载(八十六)
  8. 如何排查Java内存泄露(内附各种排查工具介绍)
  9. 参加西安第三届数字油田高端论坛暨第二届国际学术会议
  10. C++ 11 Lambda表达式