一、线程:

  程序:保存在物理介质(光盘,软盘,硬盘)当中的代码片段

  进程:一旦程序运行起来,就变成了操作系统当中的一个进程

  线程:程序当中一条独立执行的线索

二、线程的五大状态

  新生       就绪      运行      消亡

  Born            Runnable   Running        Dead

            阻塞

           Blocking

三、如何实现线程:

1.extends Thread

  @Override

  public void run(){}

2.implements Runnable

  @Overrible

  public void run(){}

3.implements java.util.concurrent.Callable

  @Override

  public String call()throws Exception{}

四、如何控制线程:

  0).setPriority(int);  设置优先级别:可选范围1-10,默认:5

  1).static sleep(long); 让当前线程休眠指定的毫秒数[涉及阻塞]

  2).static yield();    让当前线程放弃时间片直接返回就绪

  3).join()        一个线程邀请另一个线程优先执行,在被邀请的线程执行结束之前,邀请别人的线程不再执行,一直处于阻塞

  *:线程章节所有涉及到阻塞状态的方法,都需要进行异常处理~

  *:线程章节所有静态方法,不要关注谁调用方法,只要关注写在谁的线程体~

五、线程中那些可能用到的方法:

  1.setName()  + getName();设置和得到线程名字

    *:让我们通过一个线程类,创建多个不同的线程对象

  2.static  activeCount() : 得到程序当中所有活跃线程的总数~

    *:什么叫活跃线程 :

        刚出生不会跑的 不叫活跃

        已经死了不能跑的 不叫活跃

        其他状态 都算活跃,所以:活跃 = 就绪 + 运行 + 阻塞         

  3.static  currentThread() : 得到正在运行状态的线程对象~

  4.setDaemon(true):设置线程成为守护线程

     所谓守护线程,就是给其他线程提供服务的线程,

     而守护线程最大的特点就是:当程序中只剩下守护线程的时候,守护线程自省结束~

  5.interrupt(): 中断  打断线程的阻塞状态

      例如:让一个线程去睡一个小时,睡了20分钟后,我后悔了~

六、线程之间的数据共享:

  1)使用静态变量

   

  2)使用参数传递:

    

  3)使用内部类

    

七、并发错误:

多个线程共享数据的时候,很可能出现并发错误

如何解决并发错误~

  *:临界资源 = 多个线程共享的数据

  *:java给每一个对象都提供了一个标记:

    所标记 = 互斥标记 = 互斥锁标记 = 锁旗标 = 监视器 = Monitor

  使用synchronized修饰符 = 同步的

    1).修饰代码块

      synchronized(临界资源){

        1st.;

        2nd;

        erd;      

      }

    *:小括号当中是要加锁的那个对象

       代表线程要拿到它的锁标记才能进入大括号当中执行操作

     如果拿不到,则进入这个对象的锁池当中阻塞,而离开大括号,需要归还临界资源的所标记,归还锁标记的操作会让锁池当中的线程返回就绪。

    2修饰整个方法

      public synchronized void add(){

      } 

      等价于

      public void add(){

        synchronized(this){

        }

      }

    从方法的第一行到最后一行统统进行加锁,对当前对象加锁

    *:当synchronized修饰静态方法的时候相当于对 .class 文件进行加锁

    *:方法的synchronized特性只有当前类型有效,无法被子类继承得到

    *:懒汉式的getter方法必须加synchronized

八、如何解决死锁问题:

  *:最靠谱的是线程间相互"通讯"~

  Object 类的三个方法:

  1)wait():当前线程释放掉自己所有的锁标记和时间片

       并且进入调用方法的那个对象的等待池当中

  即:如果在 t1 线程当中出现stu.wait(); 就代表t1线程释放所有的锁标记和时间片

    并且进入stu对象的等待池当中  

  2)notify(): 从调用方法的那个对象的等待池当中随机的唤醒一个线程

  3)notifyAll():从调用方法的那个对象的等待池当中唤醒所有的线程~

  ****:这三个方法都必须在已经持有对象的锁标记的前提下才能调用~

     否则出现异常

    所以它们一定会出现在synchronized(abc){

                abc.wait();//abc.notify();  

              }

九:锁池和线程池的区别:

  1)进入的时候 是否需要释放资源?

    锁池:不需要释放任何资源

    等待池:需要释放所有资源

  2)出来的时候 是否需要调用代码

    锁池:完全不需要

    等待池:必须有另一个线程notify();/notifyAll();

  3)出来之后 到哪去了呢?

    锁池:直接返回就绪

    等待池:直接去锁池

线程Thread的更多相关文章

  1. Lua 学习笔记(九)协同程序(线程thread)

    协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...

  2. java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍

    (原创,转载请说明出处!谢谢--http://www.cnblogs.com/linguanh/) 此文目的为了帮助大家较全面.通俗地了解线程 Thread 相关基础知识! 目录: --线程的创建: ...

  3. Android 线程Thread的2种实现方法

    在讲解之前有以下三点要说明: 1.在Android中有两种实现线程Thread的方法: ①扩展java.long.Thread类: ②实现Runnable()接口: 2.Thread类是线程类,它有两 ...

  4. 线程(thread)

    线程(thread): 现代操作系统引入进程概念,为了并发(行)任务 1.进程之间的这种切换代价很高 2.通信方式的代价也很大基本概念: 1.线程是比进程更小的资源单位,它是进程中的一个执行路线(分支 ...

  5. Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)

    线程与操作系统中线程(进程)的概念同根同源,尽管千差万别. 操作系统中有状态以及状态的切换,Java线程中照样也有. State 在Thread类中有内部类 枚举State,用于抽象描述Java线程的 ...

  6. Asp.Net任务Task和线程Thread

    Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程.任务(Task)是架构在线程之上的, ...

  7. 线程 Thread Runnable 守护线程 join MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. Android Framework中的线程Thread及它的threadLoop方法

    当初跟踪Camera的代码中的时候一直追到了HAL层,而在Framework中的代码看见了许很多多的Thread.它们普遍的特点就是有一个threadLoop方法.依照字面的意思应该是这个线程能够循环 ...

  9. Android 线程 thread 两种实现方法

    原文链接: http://blog.csdn.net/boyupeng/article/details/6208072 这篇文章中有三点需要提前说明一下, 一: 在android中有两种实现线程thr ...

  10. 并发基础(六) 线程Thread类的start()和run()

    start()和run()方法对于刚接触线程的人来说,会有点混淆,有点难理解,一般都会有以下疑问: 一.start( )方法 1.为什么需要start方法:它的作用是什么: start方法的作用就是将 ...

随机推荐

  1. log4g

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...

  2. android Handler.btionMessage()与Message.obtain()的区别

    类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...

  3. ie7中ul不能嵌套div和li平级

    我要讲一个忧伤的故事,本以为清晰的层次结构,ul里不能嵌套div和li平级,不然会乱乱乱! 代码: <ul class="catshow">              ...

  4. 你应该知道的那些Android小经验

    原文出处:http://jayfeng.com/ 做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录. 查看SQLite日志 ad ...

  5. unsigned char 类型

    在蓝牙4.0的开发中,很多数据类型都用到了 unsigned char ,我觉得用这个类型的一个原因是相比较于整型,它占的空间更少. 比如: unsigned char a = 1;  // 占1个字 ...

  6. edgesForExtendedLayout,automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars的影响

    在IOS7以后 ViewController 开始使用全屏布局的,而且是默认的行为通常涉及到布局 就离不开这个属性 edgesForExtendedLayout,它是一个类型为UIExtendedEd ...

  7. 存储过程中使用事务,sql server 事务,sql事务

    一.存储过程中使用事务的简单语法       在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 ...

  8. SSL/TLS算法流程解析

    SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...

  9. wine

    sudo dpkg --add-architecture i386 sudo add-apt-repository ppa:wine/wine-buildssudo apt-get update su ...

  10. LeetCode----Array

    Remove Duplicates from Sorted Array 思路:两个指针,头指针在0,尾指针从1开始寻找,找到第一个不等于头指针值的数,覆盖掉头指针后面那个数,然后尾指针往后移. pub ...