一、线程和进程

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

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

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

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

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

三、多线程创建方式

  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. C# 设置Excel超链接(一)

    在日常工作中,在编辑文档时,为了方便自己或者Boss能够实时查看到需要的网页或者文档时,需要对在Excel中输入的相关文字设置超链接,那么对于一些在Excel中插入的图片我们该怎么实现超链接呢,下面给 ...

  2. 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句

    参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...

  3. alibaba fastjson 使用

    // 对象转 json 字符串 User user1 = new User("Marry", 30, new Date()); String str1 = JSON.toJSONS ...

  4. Parcelable encountered IOException writing serializable object

    异常: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 这是在in ...

  5. 小米8 探索版 屏幕指纹版超简单卡刷开发版获取Root权限的教程

    小米的手机不同手机型号通常情况下miui官网都提供两个不同的系统,分别是稳定版和开发版,稳定版没有提供ROOT超级权限管理,开发版中就开启了ROOT超级权限,在很多工作的时候我们需要使用的一些功能强大 ...

  6. ASP.NET C# 连接 Oracle数据库增删改查,事务

    一.知识介绍 ①ASP.NET 使用的是MVC模式,开发工具Visual studio ,语言C# ②Oracle是比较重型的数据库,这里主要介绍连接数据库,对数据进行具体的使用 ③Visual St ...

  7. [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(六.结语)

    到这里就结束了,真的结束了,源码会在文末分享! 另外录了两个视频,对这个系统进行了演示! 做有意义的事情,原此生无悔! 视频地址:使用asp.net core 快速构建权限管理模块1 使用asp.ne ...

  8. 监控 redis 执行命令

    监控 redis 执行命令 Intro 最近在用 redis 的时候想看看执行了哪些命令,于是发现了 redis-cli 提供的 Monitor 命令,直接使用这个就可以监控执行的大部分 redis ...

  9. Windows WMIC命令使用详解(附实例)

    第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在WMIC命令行提示符上,命令以交互的方式执行 执行“wmic”命令启动WMIC命令行环境.这个命令可以在 ...

  10. 操作DataTable数据,修改某列的值

    DataTable table : DataRow row=table.Rows[i];//DataTable的第i行 row.BeginEdit();//开始编辑行 row["column ...