涉及到
1.线程的启动(start)
2.线程的暂停(suspend()和resume())
3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return)
4.线程的优先级(setPriority())

5.线程安全相关的问题(同步加锁,守护线程)

 
一.线程与进程
   (1) 进程是受操作系统管理的基本运行单位(查看windows的任务管理器的进程更好理解)
   (2) 线程可以理解为是在进程中独立运行的子任务
   单线程与多线程,前者的特点是排队执行,也就是同步,CPU利用率大幅度降低,后者是在不同的任务间来回切换,切换速度快,使得看起来是在同一时间内运行很多不同种类的任务,多线程就等于异步.
二.使用多线程
    (1) 多线程的实现方式(两种):
            a.继承Thread类
            b.实现Runnable接口
            他们之间存在多态关系,查看源码可以看出Thread类其实也是实现了Runnable接口,也就是说这两种方式创建的线程在工作的时候性质是一样的,这也就是说使用Runnable接口的时候,构造函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象.
        注意:
            a.线程的执行是对象调用start的方法,而不是直接调用重写的run方法,调用run方法就不是异步执行,而不是同步.
            b.线程的调用是随机的,也就是说执行的结果与代码的执行顺序无关,代码的执行顺序与start()方法调用的顺序无关
三.实例变量和线程安全:
     (1).不共享数据的情况
            自己执行自己的,互不影响
     (2).共享数据的情况
            多个线程可以访问同一个变量,但这随之就会出现非线程安全的问题(与数据库中的读脏数据类似),这个时候就要考虑加锁,使用synchronized关键字,实现排队调用run方法的目的,加锁的代码称为"互斥区"或"临界区".
四.currentThread()方法,返回代码段正在被哪个线程调用的信息
五:isAlive()方法,判断当前线程是否处于活动状态,注意的是Thread.currentThread().isAlive()与this.isAlive()执行的结果可能有差异
六.sleep()方法在指定的毫秒内让当前"正在执行的线程"休眠(暂停执行)
七.getId()方法,取得线程的唯一标识
八.停止线程
     (1).使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
     (2).使用stop方法强行终止线程,属于作废过期的方法
     (3).使用interrupt方法中断线程,但是这个方法不会终止一个正在执行的线程,还需要加入一个判断才能完成线程的停止.
     1):判断线程是否停止,
            this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志置清除为false的功能,也就是连续调用两次,如果第一次是true,第二次就是flase.
            this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志
    真正的停止线程:
      (1).异常法(最常用的方法):
            在主方法中调用interrupt()后,类的run方法这样判断(注意使用try{}carch(){}捕获):
            if(this.interrupted()){
                throw new InterruptedException();
            }
       (2).在沉睡中停止:
            也就是在run方法中使线程睡眠足够的长,主方法中使用iinterrupt()方法,这个会抛出sleep interrupted异常
       (3).暴力停止(停止使用):
           使用stop()方法,会抛出java.lang.ThreadDeath异常,但不需要显示的捕捉,并且使用这个会释放锁,会导致共享数据出现问题.
       (4).使用return停止线程
            与第一种方法类似,就是将抛异常改为return;就好,不过还是建议使用第一种.
九:暂停线程:
       (1).suspend()方法会暂停线程.
       (2).resume()方法会恢复暂停的线程
        这两个都是作废过期的方法,不建议使用,1).会造成公共的同步对象的独占,使得其他线程无法访问公共同步对象.2)不同步,容易出现因为线程的暂停二而导致数据不同步的情况.
十:yield()方法:放弃当前的CPU资源,将他让给其他的任务去占用CPU执行的时间.
十一.线程的优先级(1~10):
        (1).线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务.
        使用setPriority()方法来设置优先级
        (2).线程的优先级具有继承性,也就是说A线程启动了B线程,则B线程的优先级与A是一样的.
        (3).规则:CPU尽量将执行资源让给优先级比较高的线程
            a.高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完.
            b.当优先级的差距很大时,谁先执行完和代码的调用顺序无关
            c.不要把线程的优先级与运行结果的顺序作为衡量的标准,优先级较高的线程并不一定每一次都限制性万run()方法中的任务,也就是说线程的优先级与打印顺序无关.
十二.守护线程.
        守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁,典型的守护线程就是垃圾回收线程(垃圾回收器(GC))
        使用setDaemon(true)可以将某个线程设置为守护线程.

深入java多线程一的更多相关文章

  1. JAVA多线程一

    介绍 线程是操作系统的最小单位,一个进程可以创建多个线程. 线程有五种状态,分别是新建.就绪.运行.阻塞.死亡状态. 多线程可以提高执行效率,但是如果单线程可以完成的任务,使用多线程反而会增加不必要的 ...

  2. java 多线程一

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 java 多线程实现的几种方式: 1.extends Thread 2.implements Runnable 3.im ...

  3. (三十)java多线程一

    我们通常在电脑中打开的应用称作进程,一个应用就是一个进程,而一个进程里边一般包含多个线程. 系统要为每一个进程分配独立的内存空间,而进程里的多个线程共用这些内存. 我们通常所写的main方法就是一个线 ...

  4. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  5. 用“逐步排除”的方法定位Java服务线上“系统性”故障(转)

    一.摘要 由于硬件问题.系统资源紧缺或者程序本身的BUG,Java服务在线上不可避免地会出现一些“系统性”故障,比如:服务性能明显下降.部分(或所 有)接口超时或卡死等.其中部分故障隐藏颇深,对运维和 ...

  6. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  7. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  8. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  9. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

随机推荐

  1. Software Engineering-HW8 个人总结

    Software Engineering-HW8 个人总结 2017282110264 李世钰 一.请参考第一次作业,当初你对课程的承诺和期望都兑现了吗? 大致实现了.经过了最后的团队项目,基本了解一 ...

  2. 敏捷冲刺每日报告--day1

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  3. Linux下进程间通信--消息队列

    消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...

  4. http post/get 2种使用方式

     public class HttpUtil { //HttpPost public static String executePost(String url, List<NameValue ...

  5. 过滤器Filter与监听器Listener

    过滤器Filter 过滤器也是一种servlet   它也可以对用户的请求进行处理  , 但是他所做的处理,只是一些轻量级的处理.Fileter就好像jsp页面与servlet之间的一道关卡,如果这个 ...

  6. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  7. jquery ajax file upload NET MVC 无刷新文件上传

    网上有各种各样的文件上传方法,有基于JS框架的.也有基于flash swf插件的. 这次分享一个比较简单而且实用能快速上手的文件上传方法,主要步骤: 1.引用Jquery包,我用的是jquery-1. ...

  8. SQL Server(MySql)中的联合主键(联合索引) 索引分析

    最近有人问到这个问题,之前也一直没有深究联合索引具体使用逻辑,查阅多篇文章,并经过测试,得出一些结论 测试环境:SQL Server 2008 R2 测试结果与MySql联合索引查询机制类似,可以认为 ...

  9. Extensions in UWP Community Toolkit - Mouse Cursor

    概述 UWP Community Toolkit Extensions 中有一个为 Mouse 提供的扩展 - Mouse Cursor Extensions,本篇我们结合代码详细讲解 Mouse C ...

  10. NHibernate的基本使用

    一.O/R Mapping 概论 工厂模式+反射+每个数据库的DAL层来解决数据访问层的代码 针对数据库表中字段的变化我们是无法预料的,所以每一次用户需求的修改都会直接导致我们程序员来修改—实体类(B ...