一、线程和进程

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

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

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

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

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

三、多线程创建方式

  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. git合并两个不同的仓库

    目前开发是2个仓库,线上仓库online_a(对应的branch分支为online),测试环境online_b(对应的branch分支为demo),测试环境需要时刻保持onine_a上的最新稳定稳定代 ...

  2. Vim设置Tab宽度/替换Tab为空格

    用户配置: 在/home/you/.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:set ts=4  (注:ts是tabstop的缩写,设TAB宽4个空格)set expandt ...

  3. CANVAS画布与SVG的区别

    CANVAS是html5提供的新元素<canvas>,而svg存在的历史要比canvas久远,svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属 ...

  4. CSS Grid 布局完全指南(图解 Grid 详细教程)

    CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...

  5. java 应用程序的编译和运行

    1.java 文件的编译和执行步骤. 第一步:使用编辑器编辑  后缀为java的文件,里面包含主类(包含 main()函数), 源文件的命名规则是,如果源文件中有多个类,那么只能有一个类是public ...

  6. python告诉你ti8 dota2英雄bp

    文章链接:https://mp.weixin.qq.com/s/phJzZEQojndY-iNe77RF_w 恭喜OG成为ti8冠军,很可惜这次偶数年ti8中国队LGD与冠军失之交臂. 上学那会儿还是 ...

  7. win10安装JDK详细教程

    电脑进行了重装机器.需要重新安装,在此记录一下. 点击下一步.选择安装路径 . 等待后,选择安装位置. 点击下一步,继续等待. 安装完成. 设置环境变量 在桌面右键单击 我的电脑→属性→高级系统设置→ ...

  8. 010 Editor v8.0.1(32 - bit) 算法逆向分析、注册机编写

    010 Editor 的逆向分析整体算下来还是比较简单的,将程序拖入OD,通过字符串搜索定位到核心代码,经过分析,主要是如下图所示的两个关键函数,返回正确的值,才算是注册成功. 00409C9B 这个 ...

  9. 给Integer对象加锁的错误方式

    package com.thread.test; public class BadLockOnInteger implements Runnable { public static Integer i ...

  10. 爬虫系列----scrapy爬取网页初始

    一 基本流程 创建工程,工程名称为(cmd):firstblood: scrapy startproject firstblood 进入工程目录中(cmd):cd :./firstblood 创建爬虫 ...