第十一章 多线程技术
多线程大量应用于网络编程和服务器端程序的开发。
eg:UI系统底层原理,OS底层原理。

11.1 基本概念
11.1.1 程序program
1, 静态概念,对应于操作系统中的一个可执行文件。
执行可执行文件将会加载该程序到内存中并开始执行,
这便产生了进程。

11.1.2 进程process 1,执行中的程序叫做进程,这是一个动态概念2,进程特点:.进程是程序的一次动态执行过程,占用特定的地址空间。.每个进程由:cpu,date,code组成。进程之间相互独立。.多任务操作系统将cpu时间动态划分给每个进程。操作系统同时执行多个进程,每个进程独立运行。.进程查看:win:Ctrl+Alt+Del.11.1.3 线程1,一个进程产生多个线程,又称:轻量级进程。线程与多个进程可以共享os的某些资源。同一进程的多个线程也可共享此进程的某些资源。2,线程特点.一个进程内部的一个执行单元.一个进程可以拥有多个并行的线程.一个进程的多个线程共享相同的内存单元/地址空间。.线程间通信便捷,信息传递快。.线程的启动,中断,消亡。消耗资源很少。11.1.4 线程和进程的区别 .每个进程之间有独立的代码和数据空间,进程间的切换消耗大。.同一进程线程共享代码和数据空间,每个线程拥有独立的运行栈和程序计数器(pc),线程切换开销小。.线程和进程根本区别:进程是资源分配单位,线程是调度和执行单位。.多进程:在os中同时运行多个任务。.多线程:同一应用中有多个顺序流同时执行。.线程是进程的一部分.单线程:一个没有线程的进程。.系统运行时为每个进程分配内存,不会为线程分配内存。.线程组间共享所属进程资源。 11.1.5 进程与程序的区别1,程序是一组指令集合,他是静态实体,没有执行的含义。进程是一个动态实体,有自己的生命周期。一个进程有且仅对应一个程序。一个程序可以对应多个进程,或没有。进程并发性和交互性。

11.2 java中如何实现多线程:“Thread类,Runnable接口,callable接口”
11.2.1 通过继承Thread类实现多线程
1,实现步骤
在Java中负责实现线程功能的类是java.lang.Thread类。
通过创建Thread类的实列来创建新的线程。
每个线程都是通过某个特定的Thread对象所对应的方法run(),
来完成其操作的,方法run()称为线程体。

 2,代码实现 //自定义类继承Thread类public class TestThread extends Thread{//run()方法里面是线程体public void run(){for(int i=0;i<100;i++){//getName()方法用于返回线程名称 System.out.println(this.getName() + ":" + i)}} }    public static void main(String[] args){//创建线程对象 TestThread thread1 = new TestThread(); //启动线程thread1.start();TestThread thread2 = new TestThread(); thread2.start();} 3,这种方法的缺点如果类已经继承了一个类,则无法再继承thread类。11.2.2 通过Runnable接口实现多线程1,开发过程中,更多的是通过Runnable接口实现多线程,其克服了Thread类的缺点。实现Runnable接口的同时还可以继承某个类。2,代码实现//自定义类实现Runnable接口 public class TestThread2 implements Runnable{//run方法里面是线程体public void run(){for(int i=0;i<100;i++){System.out.print(Thread.currentThread().getName() +":"+ i);}} } public static void main(String[] args){//创建线程对象,把实现了Runnable接口的对象作为参数传入Thread thread1 = new Thread(new TestThread2);thread1.start();thread thread2 = new Thread(new TestThread2);thread2.start(); }

11.3 线程状态和生命周期
11.3.1 线程状态:New,Runnable,Running,Blocked,Terminated.
1.新生态New:new关键字建立一个对象后,该对象就处于新生态。
拥有自己的空间,调用start()方法后进入就绪状态。

 2,就绪状态Runnable:具备运行条件,未分派cpu.一旦获得cpu,线程就进入运行状态,并自动调用其run()方法。导致线程进入就绪状态的4种原因:新建线程:调用start()方法。阻塞线路:阻塞解除。运行线路:调用yield()方法。运行线路:jvm将cpu资源从本线程切换到其他线程。3,运行状态Runing:运行状态的线程执行run()方法中的代码,直到因调用其他方法而终止,或等待某资源产生阻塞或完成任务死亡。在给定时间片内没有执行结束,线程被系统换下回到就绪状态。也可能由于阻塞事件进入阻塞状态。4,阻塞状态Block:暂停一个线程的执行以等待某个条件发生。导致阻塞的四种原因:.执行sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。指定时间到了之后,线程进入就绪状态。.执行wait()方法,使当前线程进入阻塞状态。当使用notify()方法唤醒这个线程后,进入就绪状态。.线程运行时,某个操作进入阻塞状态。eg:执行I/O流操作。(read()/wite()方法本身就是阻塞方法),阻塞原因消失后,线程进入就绪状态。. join()线程联合:某线程等待另一线程执行结束并能继续执行时,使用join()方法。5,死亡状态Terminated:线程生命周期的最后一个阶段。线程进入死亡状态后,不能再回到其他状态。 2个线程死亡原因:.正常运行的线程完成run()方法内的全部工作。.线程被强制终止;eg(jdk已废弃):stop(),destory().11.3.2 终止线程的典型方式通常做法是提供一个boolean型的终止变量,当这个变量为false时,终止线程。public class TestThreadCiycle implements Runnable{String name;boolean live = true;//标记变量,表示线程是否可中止。public TestThreadCiycle(String name){super();this.name = name;} public void run{int i = 0;//当live的值为true时继续线程体;false则结束循环,继而中止线程。while(live){System.out.print(name + (i++));}    }public void terminate(){live = false;}public static void main(String[] args){TestThreadCiycle ttc = new TestThreadCiycle("线程A");Thread t1 = new Thread(ttc);//新生状态t1.start();//就绪状态for(int i = 0;i<100;i++){System.out.println("主线程" + i);} ttc.terminate();System.out.println("ttc stop!");}} 11.3.3 暂停线程执行的常用方式:sleep(),yield()1,两个方法的区别sleep():让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态。yield():让正在运行的线程直接进入就绪状态,让出cpu的使用权。 11.3.4 联合线程的方法:join();1,线程A在运行期间可以调用线程B的join()方法,让线程B和线程A联合。这样线程A就必须等待线程B执行完毕,才能继续执行。

11.4 线程的基本信息和优先级别
11.4.1 获取线程基本信息的方法
isAlive();判断线程是否活着。
getPriority();获得线程优先级数值。
setPriority();设置线程优先级。
setName();给线程一个名字。
getName();取得线程名字。
currentThread(); 取得当前正在运行线程对象,也就是取得自己本身。

11.4.2 线程的优先级处于就绪状态的线程,会进入“就绪队列”等待jvm来挑选。线程优先级:1~10,默认优先级为5.获得线程优先级:int getPriority();设置线程优先级:void setPriority();优先级低只代表着获得调度概率低,并不绝对先调度优先级高的线程后再调度优先级低的线程。

11.5 线程同步
处理多线程问题时,如果多个线程同时访问同一个对象,
并且某些线程还想修改这个对象时,就需要用到“线程同步”机制。

11.5.1 什么是线程同步1.同步问题的提出同一资源多人都想同时使用。2.线程同步概念线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用。11.5.2 实现线程同步:synchronized方法,synchronized块,lock.lock 由于同一进程的多个线程共享一块存储空间,带来方便的同时,也带来访问冲突。private关键字保障了数据对象只能被方法访问 针对对方法提出的两种解决办法:1.synchronized方法:控制对对象的类成员变量的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象的锁才能执行,否则所属线程阻塞,方法一旦执行就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程才能获得该锁,从新进入可执行状态。1.语法格式:public synchronized void accessVal(int newVal);2.使用缺陷:若将一个大的方法声明为synchronized将会大大影响程序工作效率。 2.synchronized块:1.精确控制具体成员变量,缩小同步范围,提高效率。语法格式:synchronized(syncObject){//允许访问控制的代码。 } 3.jdk1.5后提供的,简单高效 lock.lock(){try{}catch(){lock.unlock;}} 11.5.3 死锁解决方案1.死锁概念:多个线程各自独占一些共享资源,并且互相等待得到其他线程占用的资源后才能继续,从而导致两个或多个进程都在等待对方释放资源,停止执行的情形。2.死锁原因 同步块需要同时持有多个对象锁 3.死锁状态:两个线程形成相互等待,无法继续运行。 4.死锁的解决办法:同一代码块不要同时持有两个对象锁。

11.6 线程并发协作(生产者-消费者模式)
1.概念:
1.生产者:负责生产数据的模块(方法,对象,线程,进程etc).
2.消费者:负责处理数据的模块(方法,对象,线程,进程etc).
3.缓冲区:介于生产者和消费者之间。是实现并发的核心。

 设置缓冲区的好处:1.实现线程的并发协作。生产者只管往缓冲区里放数据 ,消费者只管从缓冲区取数据。 2.解耦了生产消费关系。生产者和消费者不直接打交道。3.解决忙闲不均,提高效率。生产者生产慢时,缓冲区有数据不影响消费者使用。消费者消费慢时,生产者仍可以继续往缓冲区里面放数据。2,线程并发协作(线程通信)通常用于生产者-消费者模式,情景如下1.生产者消费者共享同一资源,他们相互依赖互为条件。2.生产者未生产之前,消费者要等待,生产之后需要马上通知消费者。3.消费者消费后,要马上通知生产者消费结束,需要继续生产新产品消费。4.生产者-消费者问题中,synchronized仅仅可以阻止并发更新同一个资源,虽然实现了同步,但是不能实现线程之间的通信。3.线程通信常用方法以下方法均是java.lang.Object类的方法,只能在同步方法和同步块中使用,否则会抛出异常。final void waite();表示线程一直等待,直到得到其他线程通知void wait(long timeout);线程等待指定毫秒参数的时间 。final void wait(long timeout,int nanos);线程等待指定毫秒,微秒的时间。 final void notify();唤醒一个处于等待状态的线程。final void notifyAll();唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行。4.实际开发中,尤其是“架构对象”中会大量使用生产-消费模式。中高级开发人员必须掌握内容。

11.7 任务定时调度
实际项目开发中使用quanz任务框架来开发,其底层是Timer。

通过Timer,Timertask实现定时启动某个线程,并通过线程执行某个任务的功能1.Timer:jdk提供的一个定时工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务。可以指定执行一次或反复多次,起到类似闹钟的作用。 2.TimerTask:是一个实现Runnable接口的抽象类,所以具备多线程的能力。将需要多线程执行的代码写在run()方法内,通过Timer类启动线程的执行。实际使用时,一个Timer可以启动任意多个TimerTask实现的线程,但是多个线程之间会出现阻塞。所以,多个线程之间需要完全独立的话,最好还是一个Timer启动一个TimerTask.

java 第十一章 多线程技术相关推荐

  1. 速学堂(java)第十一章编程题答案(自写)

    速学堂(java)第十一章编程题答案(自写) 1.设计一个多线程的程序如下:设计一个火车售票模拟程序.假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况 ...

  2. Java第十一课——多线程实现飞机大战

    Java第十一课--多线程实现飞机大战 一.补充讲解一下线程 在第九课的基础上补充两点: 1.启动线程使用start()方法而不直接使用rin()方法,因为线程是一直重复执行的,调用run方法只会执行 ...

  3. Java的知识点24——多线程技术理论——程序、进程、线程

    多线程技术 三高:高可用.高性能.高并发 基本概念:多线程是Java语言的重要特性,大量应用于网络编程.服务器端程序的开发,最常见的UI界面底层原理.操作系统底层原理都大量使用了多线程. 我们可以流畅 ...

  4. java第七章多线程_第七章 多线程

    7 多线程 7.1 进程和线程 1.进程进程是一个正在执行中的程序 每一个进程都有一个执行顺序,该顺序是一个执行路径,或者叫做一个控制单元 2.线程线程就是进程中的一个独立控制单元 线程在控制着进程的 ...

  5. java第五章 多线程_java多线程编程核心技术——第五章总结

    定时器Timer的使用 在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务. Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类. 执行计划任 ...

  6. java 第十一章总结

    加载驱动 try{Class.forName("com.mysql.jdbc.Driver");}catch(Exception e){} 连接数据库 Connection get ...

  7. Java复习第九章 多线程

    问题1:创建线程的基本方法有哪些? 1.通过继承Thread类创建线程 public class MyThread extends Thread{//覆写Thread的run()方法@Override ...

  8. 第十一章 软件保护技术(一)(软件保护技术简介)

    文章目录 软件保护技术 软件保护技术简介 软件保护技术 伴随软件破解技术发展 经历软件安全对抗技术的演变,向信息安全技术标准化和安全服务产业化的方向发展 (Android 平台)包括通用软件保护技术和 ...

  9. Java 第十一章总结 枚举与泛型

    11.1 枚举 (1) 使用枚举类型设置常量 在项目中创建Constants接口,在接口中定义常量的常规方式. public interface Constants{ public static fi ...

  10. 计算机三级网络技术第十一章(第一轮)

    编程伙伴猛 ~ ~ 终于到最后一章啦~~ 激动地心.颤抖地手.小银子本银还没想好要不要出第二轮,因为看到某乎上各种两星期过三级的,小银子不得不心动啊~啊·~啊·~ 所以,如果没有第二轮,本银打算等过了 ...

最新文章

  1. 图片资源 php,php图片转为资源数据
  2. 日本“AI 鱼脸识别”项目,每分钟识别 100 条
  3. 循环神经网络教程4-用Python和Theano实现GRU/LSTM RNN, Part 4 – Implementing a GRU/LSTM RNN with Python and Theano
  4. 程序员远程办公需要面临哪些挑战?
  5. 404页面自动跳转javascript
  6. 贪吃蛇c语言代码高难,100多行代码的《贪吃蛇》
  7. 力扣-811 子域名访问计数
  8. vb.net html元素,vb.net 教程 12-3 HtmlElement类 1
  9. 三、生成树协议(Spanning Tree Protocol,STP)
  10. 基于微信在线电子书阅读小程序设计与实现开题答辩PPT
  11. const常量和基础数据类型
  12. 详解Shell脚本:sed命令工具 ,awk命令工具
  13. 华南师大计算机转专业,广西师范大学计算机科学与信息工程学院/软件学院转专业管理规定(试行)...
  14. web开发一定时间没操作_Web开发—明智地投资您的时间
  15. LM393芯片功能及原理
  16. mysql 读取clob数据类型_谈谈有关各数据库Blob、Clob类型字段的读取、保存更新
  17. 【实验3 循环结构】7-14 循环结构 —— 中国古代著名算题。趣味题目:物不知其数。
  18. 【江苏三新】电气类就业如何跳出“内卷”实现“躺平”?
  19. 迪士尼举办“好奇无界:米奇艺术展”中国巡展;延安万达嘉华及万达锦华酒店在延安红街开业 | 全球旅报...
  20. java命令后加绝对路径无法运行

热门文章

  1. 面对换领导或空降管理者,该怎么办?
  2. 深度学习-22:信息论和信息熵
  3. 基于python的简易安卓小外挂制作
  4. python画太阳花代码
  5. idea代码编辑CPU使用率飙升100%
  6. 搭建本地私有pip源
  7. nginx: [emerg] still could not bind()
  8. c语言的area的用法,area的用法说明
  9. 桌面麒麟系统添加字体
  10. java 子网掩码 位数_java实现子网掩码转换为网络标识位 | 学步园