一、线程和进程

  每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。

  进程是所有线程的集合,每一个线程是进程中的一条执行路径。

二、为什么使用多线程,哪些场景下使用

  多线程的好处是提高程序的效率。

  主要能体现到多线程提高程序效率。如:迅雷多线程下载、分批发送短信等。。。。

三、多线程创建方式

  1)继承Thread类,重写run方法

    public class ThreadDemos extends Thread {
        public void run() {

  2) 实现Runnable接口,重写run方法

    public class RunnableDemo implements Runnable {
        public void run() {
 3) 使用匿名内部类方式

    Thread thread = new Thread(new Runnable() {
        public void run() {
            //TODO
        }
    });
四、线程启动方式
  开始执行线程是不是调用run方法,而是start方法。调用run方法是使用实例调用方法,不是线程启动。
  而实现Runnable接口的方法,需要new Thread(new
RunnableDemo()).start()。
五、多线程生命周期

  

  线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。

  1)新建状态

    当用new操作符创建一个线程时,例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。当一个线程处于新生状态时,程序还没有开始运行线程中的代码。

  2)就绪状态

    一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

  处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。

  3)运行状态

    当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法。

  4)阻塞状态

    线程运行过程中,可能由于各种原因进入阻塞状态:
          1>线程通过调用sleep方法进入睡眠状态;
          2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
          3>线程试图得到一个锁,而该锁正被其他线程持有;
          4>线程在等待某个触发条件。

  5)死亡状态

    有两个原因会导致线程死亡:
       1) run方法正常退出而自然死亡,
       2) 一个未捕获的异常终止了run方法而使线程猝死。
      为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true;如果线程仍旧是new状态且不是可运行的,或者线程死亡了,则返回false。

常用线程api方法

start()

启动线程

currentThread()

获取当前线程对象

getID()

获取当前线程IDThread-编号  该编号从0开始

getName()/setName()

获取当前线程名称/设置线程名称

sleep(long mill)

休眠线程

stop()

停止线程

常用线程构造函数

new Thread()

分配一个新的 Thread对象

new Thread(String name)

分配一个新的 Thread对象,具有指定的 name正如其名。

new Thread(Runable r)

分配一个新的 Thread对象

new Thread(Runable r, String     name)

分配一个新的 Thread对象

六、思考点

  1).进程与线程的区别?
    答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径。
  2).为什么要用多线程?
    答:提高程序效率
  3).多线程创建方式与启动子线程方法?
    答:继承Thread或实现Runnable 接口。Thread直接利用构造出来的对象调用start()方法。Runnable因为没有继承Thread类,无法调用start方法,需要new Thread(new RunnableDemo()),再调用start方法。
  4).是继承Thread类好还是实现Runnable接口好?
    答:Runnable接口好,因为实现了接口还可以继续继承。继承Thread类不能再继承。
  5).你在哪里用到了多线程?
    答:主要能体现到多线程提高程序效率。
    举例:迅雷多线程下载等。

JAVA多线程-初体验的更多相关文章

  1. JAVA 11初体验

    JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...

  2. java的多线程初体验

    这里以车站售票作为模拟场景,多个票务人员同时出售某一列高铁(G250?)的车票,售票的基本保证有2点: 1.不能售出多于预定限额的车票. 2.不能售出具有相同座位的车票. 初学java,有不当的地方各 ...

  3. Java爬虫初体验

    年关将近,工作上该完成的都差不多了,上午闲着就接触学习了一下爬虫,抽空还把正则表达式复习了,Java的Regex和JS上还是有区别的,JS上的"\w"Java得写成"\\ ...

  4. Java集合初体验

    背景:        因为对Java的集合完全不了解,所以才在网上找了找能形成初步印象的文章进行学习,大多涉及的是一些概念和基础知识. 一.数组array和集合的区别: (1)数组是大小固定的,并且同 ...

  5. java学习初体验之课后习题

    import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { //打印Hel ...

  6. Java单元测试初体验(JUnit4)

    什么是单元测试 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应 ...

  7. java activemq初体验

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  8. java学习初体验NO.1

    一.学习目标: 1.理解Java编译原理 在Java编程语言中,所以源代码首先以用.Java扩展名结尾的纯文本件编写,然后,编译器将这些源文件编译成.Class文件.然后,Java启动器工具使用Jav ...

  9. java程序初体验

    示例代码 class Demo { public static void main(String[] args) { System.out.print("hello world") ...

随机推荐

  1. vue 音乐App QQ音乐搜索列表最新接口跨域设置

    在 webpack.dev.config.js中 'use strict' const utils = require('./utils') const webpack = require('webp ...

  2. Dynamics 365-如何利用Audit History还原被删除的数据

    Audit History,常被用来记录record的日常操作信息,包括创建,更新,删除.这是一个非常实用的功能,想想看,如果数据被误修改了,通过Audit History,可以很容易地找到修改前的数 ...

  3. python(day17)二分查找

    l = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31] def find(l ,aim ,start = 0,end = None): end = len(l ...

  4. Android PAI (PlayAutoInstall)预装APK 功能

    最近刚找到工作,是手机方案公司,刚接触手机系统预装的APP,以及解决方案MTK平台下预装APP的bug,也接触到了Launcher的东西. 然后接触到了第一个需求 PAI预装APK功能 下面是我用到的 ...

  5. MySQL 基础知识梳理学习(一)----系统数据库

    information_schema 此数据库是MySQL数据库自带的,主要存储数据库的元数据,保存了关于MySQL服务器维护的所有其他数据库的信息,如数据库名.数据库表.表列的数据类型及访问权限等. ...

  6. EF ORM

    //新增 UserInfo userInfo = new UserInfo(); userInfo.UserName = "YANG"; userInfo.UserPass = & ...

  7. IOS开发protocol使用

    1.什么是protocol? protocol(协议)是用来定义对象的属性和行为,用于回调. 2.protocol分类? 协议中有三个修饰关键字@required和@optional和@propert ...

  8. 本地系统服务例程:Nt和Zw系列函数

    Windows本地操作系统服务API由一系列以Nt或Zw为前缀的函数实现的,这些函数以内核模式运行,内核驱动可以直接调用这些函数,而用户层程序只能通过系统进行调用.通常情况下用户层应用程序不会直接调用 ...

  9. 系统功能调用Windows操作系统原理实验

    一.实验目的 1.熟悉操作系统的系统功能调用. 2.掌握用C语言实现系统功能调用的方法和步骤. 3.掌握利用10H号功能调用(BIOS的显示I/O功能调用)来实现对屏幕的操作与控制. 二.实验内容 1 ...

  10. 企业业务数据处理用“work”还是“MQ”

    近期公司在做架构梳理已经项目架构方向,不知不觉就引起了使用“work”跑数据还是用“MQ”进行跑数据的争论! 对于争论这件事在各行各业都有,其实我觉得针对“争论”这个词的根源在于一件事情有很多解决方案 ...