一、概念基础

  进程:正在进行中的程序(直译).
  线程:就是进程中一个负责程序执行的控制单元(执行路径)

  一个进程中可以多执行路径,称之为多线程。
  一个进程中至少要有一个线程。

  开启多个线程是为了同时运行多部分代码。

  每一个线程都有自己运行的内容。这个内容可以称为线程要执行的任务。

  多线程好处:解决了多部分同时运行的问题。
  多线程的弊端:线程太多会导致效率的降低,其实应用程序的执行都是cpu在做着快速的切换完成的。这个切换是随机的。

  JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。
  1,执行main函数的线程,该线程的任务代码都定义在main函数中。
  2,负责垃圾回收的线程。

  可以通过Thread的getName获取线程的名称 Thread-编号(从0开始),主线程的名字就是main。
  创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。而运行的指定代码就是这个执行路径的任务。jvm创建的主线程的任务都定义在了主函数中。
  而自定义的线程它的任务在哪儿呢?Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。这个任务就通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数。run方法中定义的就是线程要运行的任务代码。

  开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。将运行的代码定义在run方法中即可。

二、如何创建一个线程呢?

  创建线程方式一:继承Thread类。
  步骤:
  1,定义一个类继承Thread类。
  2,覆盖Thread类中的run方法。
  3,直接创建Thread的子类对象创建线程。
  4,调用start方法开启线程并调用线程的任务run方法执行。

  创建线程方式二:实现Runnable接口。
  步骤:
  1,定义类实现Runnable接口。
  2,覆盖接口中的run方法,将线程的任务代码封装到run方法中。
  3,通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。

    因为实现Runnable接口的类只是实现了将任务单独进行了封装,该实现类仍然不是线程,不能调用start等线程类的方法,所以要创建Thread对象。
    线程的任务都封装在Runnable接口子类对象的run方法中,所以要在线程对象创建时就必须明确要运行的任务,这就是以Runnable的子类对象为参数的原因

  4调用线程对象的start方法开启线程。注意,不能对一个线程对象多次调用start方法,否则会报IllegalThreadStateException,为什么呢?因为线程一旦        start就会从静止状态(创建)变成了运行状态或者就绪状态,对于运行状态或者就绪状态来说,他们早已经start了,此时再调用start是要做啥呢。

  实现Runnable接口的好处:
  1,将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务的封装成对象,这样在创建线程对象的时候,多个线程对象可以共用     一个任务对象,达到多个线程同时执行一个任务的目的。
  2,避免了java单继承的局限性,有于java只能单继承,如果一个类有了父类的话就不能直接再继承Thread类了,只能实现Runnable接口了

  所以,创建线程的第二种方式较为常用。

三、同步函数和同步代码块的区别:

  同步函数的锁是固定的this。
  同步代码块的锁是任意的对象。
  建议使用同步代码块。

四、线程安全
  线程安全问题产生的原因:
  1,多个线程在操作共享的数据。
  2,操作共享数据的线程代码有多条。
  当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导致线程安全问题的产生。

  解决思路;
  就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程时不可以参与运算的。必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算。在java中,用同步代码块就可以解决这个问题。

  同步代码块的格式:
  synchronized(对象)
  {
   需要被同步的代码 ;
  }

  同步的好处:解决了线程的安全问题。
  同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。
  同步的前提:同步中必须有多个线程并使用同一个锁.

  静态的同步函数使用的锁是 该函数所属字节码文件对象,可以用 getClass方法获取,也可以用当前 类名.class 表示。

  死锁:常见情景之一:同步的嵌套。

  wait 和 sleep 区别?

  1.wait可以指定时间也可以不指定,sleep必须指定时间。

  2.在同步中时,对cpu的执行权和锁的处理不同。
     wait:释放执行权,释放锁。
     sleep:释放执行权,不释放锁。

五、异常的内容(补充)

  异常的完整内容包含:异常所属的线程(在哪个线程上发生了异常)、异常的名称、异常的信息、异常的位置

java多线程编程(一)的更多相关文章

  1. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  2. Java多线程编程核心技术---对象及变量的并发访问(二)

    数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...

  3. Java多线程编程——进阶篇二

    一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等待的单个 ...

  4. Java多线程编程详解

    转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...

  5. 【Todo】【读书笔记】Java多线程编程指南-设计模式篇

    下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.

  6. Java多线程编程总结(学习博客)

    Java多线程编程总结:网址:http://lavasoft.blog.51cto.com/62575/27069/

  7. Java多线程编程的常见陷阱(转)

    Java多线程编程的常见陷阱 2009-06-16 13:48 killme2008 blogjava 字号:T | T 本文介绍了Java多线程编程中的常见陷阱,如在构造函数中启动线程,不完全的同步 ...

  8. Java多线程编程(二)

    在 Java多线程编程(一) 中的多线程并没有返回值,本文将介绍带返回值的多线程. 要想有返回值,则需要实现新的接口Callable而不再是Runnable接口,实现的方法也改为call()方法,执行 ...

  9. Java多线程编程总结(精华)

    Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...

  10. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

随机推荐

  1. Java初学者作业——简单程序根据用户输入的会员类型以及购物金额,判断是否能够享受活动优惠

    返回本章节 返回作业目录 需求说明: 超市周年庆举行购物满减活动,编写Java程序,根据用户输入的会员类型以及购物金额,判断是否能够享受活动优惠,会员类型的输入不限制大小写.具体获取规则:若为VIP会 ...

  2. 初识python: 递归函数

    定义: 在函数内,可以调用其他函数,如果一个函数在内部调用自己,返回值中包含函数名,这个函数就是递归函数. 特性: 1.必须要有明确的结束条件: 2.每进入更深一层递归时,问题规模相对上次递归都应该有 ...

  3. PowerShell 管道符之Select的使用方法【二】

    这次讲解Select中的第二个方法:String 在我们的ISE编辑器中输入如下命令 Select-String - 可以了解到,原来这是正则表达式,它提供了一些额外的正则方法.具体如何使用,可以自行 ...

  4. linux光标命令快捷键(常用)

    Ctrl+a 移动到首行 Ctrl+e 移动到尾行 Ctrl+u 将当前光标后面的内容全部删除 (剪辑) ctrl+k 将当前光标前面的内容全部删除 (剪辑) Ctrl+→(左右同理) 移动到下个空格 ...

  5. 接口神器之 Json Server 详细指南

    简介 json-server 是一款小巧的接口模拟工具,一分钟内就能搭建一套 Restful 风格的 api,尤其适合前端接口测试使用. 只需指定一个 json 文件作为 api 的数据源即可,使用起 ...

  6. 51 Nod 1091 线段的重叠 (贪心算法)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 思路分析:通过读题不难发现这是一道涉及贪心算法的题,刚 ...

  7. test_6 python的列表去重

    1.使用内置函数set() set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 2.创建一个空的列表进行比较,把不重复的元素添加到新的列表中 #co ...

  8. 记一次异步处理导致Jetty Request对象泄漏

    最近排查一个bug,发现了一系列有意思的东西,对「自定义线程池」.「Jetty线程模型」都有了一些新的认识. 本文预计阅读时间10分钟,包括: 问题表现 常见原因筛查 根因与源码分析 最佳实践 一些小 ...

  9. Android官方文档翻译 十四 3.2Supporting Different Screens

    Supporting Different Screens 支持不同的屏幕 This lesson teaches you to 这节课教给你 Create Different Layouts 创建不同 ...

  10. kafka入门(采坑)笔记

    前言 之前在工作和学习过程中也会有记笔记的习惯,但是没有发布出来,也因最近各方面的瓶颈急需突破和提升,所以还是要很积极的融入大环境大生态中,好废话不多说,说下这次遇到的问题 第一步启动zk 根据教程安 ...