Java基础总结--多线程总结2

----多线程通信-----
1.概述:多个线程处理同一个资源,但是各自的任务不相同
eg:线程1负责存储数据,线程2负责处理该数据。数据--就是同一个资源
怎样用java语言描述上面的例子:
* 资源是变化的--数据是变化的--将其封装为对象
* 存在两个任务不同的线程,需要2个run方法--所以封装在两个不同的线程类中
* 必须保证输入和输出处理的是同一个对象-输入输出构造方法传参数(参数为资源对象引用)
* 主函数里面,创建资源对象,线程类对象,启动线程
2.多线程通信依然会出现线程安全的问题
解决办法--同步,在存储资源加同步,但是依然会出错--确保需要同步的都同步
想想同步的前提:同一个锁--多个线程:在输入和输出线程都加同步一个锁保证同步的实现
注意:关于结果的一定分析:输入线程获得执行权,不断的进行赋值操作(会切换),等到时

间片结束后,执行权到输出线程,然后输出线程也会执行一段时间,所以导致输出一大片相

同的情况的出现
3.线程的等待和唤醒机制(重要)----控制输入线程和输出线程的合作
输入-先判断有数据吗--无则输入,有则等待(存在执行权-要释放执行权和执行资格)-阻塞并

唤醒对方 wait()+notify()
输出-先判断有数据吗--有则取出,无则等待(存在执行权-要释放执行权和执行资格)-阻塞并

唤醒对方 wait()+notify()
输入线程与输出线程互相唤醒对方,阻塞是自我的阻塞
涉及到的方法:
wait():让线程处于阻塞状态,被wait的线程被存储在线程池当中
notify():唤醒线程池里面任意的一个线程
notifyAll():唤醒线程池里面所有的线程-让线程具备执行资格
注意:
1.这些方法必须定义在同步中,因为这些方法是用于操作线程状态的方法,必须要明确到底

操作的是那个锁上的线程(wait/notify控制某个锁范围内的线程)。
所以调用wait/notify方法必须由多线程对应的锁调用:r.wait/notify
2.wait/notify是在Object里面定义的方法(原因:这些方法是监视器的方法,监视器可以是

任意的对象,所以定义在Object里面),用来操作指定监视器上的线程。
3.wait--throws InterruptedException
4.对于资源的数据应该私有,对外提供访问的方法(保证资源数据同步,唤醒阻塞控制);对

于线程体只仅仅的调用这些方法就可以,不需要再进行额外的处理线程安全以及顺序控制
锁在那里--wait、notify就在那里
5.注意:if是为真执行,wait后,run里面的内容不再继续向下执行

----等待唤醒机制的应用----生产者消费者问题-----
代码模拟一个生产者--一个消费者
1.Rescource
2.Producer
3.Consumer
代码模拟多生产者(t0,t1)--多消费者(t2,t3)
多生产多消费会出现错误原因---t0唤醒t1后,t1直接不进行标记的判断直接生产,导致
前一个产品未被消费,又生产了新的产品。改进if判断改为while循环,会可能出现死

锁,t0,t1,t2,t3都处于阻塞状态。改进想要保证唤醒对方,只好使用notifyAll方法,唤醒所

有被阻塞的方法,本方活,会判断不会盲目生产,对方活了,就能解决死锁。
注意:使用if判断,只会进行判断一次,会导致不该运行的线程运行,导致数据错误
使用notify方法:只是随机的唤醒一个线程,可能就是本方的线程,进而导致死锁
使用while循环--保证线程被唤醒后,线程是否要执行
使用notifyAll()解决死锁保证唤醒的线程包含对方线程
多生产多消费 使用while+notifyAll(效率不好,唤醒本方要进行判断)
新的工具-java.util.concurrent.locks包(包含一些类和接口)--对synchronized的替代
JDK1.5后将同步封装为对象,并将操作锁的隐式定义封装到对象中,将隐式变为显示
try-catch-finally(一定会释放互斥锁)

新工具Lock接口(替代synchronized相关)+Condition接口(封装await/single/singleAll方法

)组合使用。一个锁对象--可以附带多组等待唤醒方法
Lock lock = new ReeectrantLock();
Condition c1 = lock.newCondition();//lock锁对象--两组监视器方法
Condition c2 = lock.newCondition();
之前出现死锁--是没有互相唤醒,或就是去全部唤醒(一个组监视器方法监视生产者消费者)
现在改进后,采用两组监视器方法分别监视生产者和消费者,保证可以实现相互唤醒

关于新工具的总结:
Lock接口:出现的原因是为了替代同步代码块/同步方法,将同步的隐式锁操作变为显示的锁

操作,同时更加灵活,可以在一个锁对象上面加多组监视器
Condition接口:出现替代了Object里面的wait/notify/notifyAll方法,将这些监视器方法

进行单独封装,变成Condition监视器对象,可以和任意锁对象进行组合
对应的监视器方法变为:await/singal/singalAll

---wait/sleep区别----(重要)
1.wait可以指定时间,可以不指定时间;sleep必须指定时间
2.在同步中对CPU的执行权和锁的处理不同
线程wait后,释放执行权,释放锁(必须被唤醒不是主动唤醒)
线程sleep后,释放执行权,但是不会释放锁
3.to,t1,t2都在同步中被wait并释放执行资格和执行权和锁,t4唤醒全部线程,t0,t1,t2,此

时在同步中被唤醒具有执行资格,但是不具备执行权,因为t4还持有锁,t4执行完后释放锁

,被唤醒的3个线程中的一个线程被CPU调度,获得锁开始执行线程的内容。
本质:在同步中,只有持有锁的线程可以运行

-----线程的停止-------
1.stop方法--过时存在不安全性(强制终止线程)
2.run方法执行完后就正常终止(里面一般都具备循环)
3.之所以使用多线程就是解决,程序中某段代码执行此时过多,影响下面代码的执行,所以

通常把循环放在线程里面,下面的代码方主线程里面,让它们并发执行,可以提高效率
-----怎样控制线程任务结束---
任务都会有循环结构,只要控制住循环就可以结束任务
控制循环:通常使用定义条件标记完成
对外提供公开的修改标记值的方法,并在主线程中调用该方法就可以停止线程
4.同步中如何停止线程(线程处于冻结状态-没有机会读到标记)
interrupt方法--在调用sleep,wait等方法处于冻结状态后,调用interrupt方法可以清除中

断状态--将线程的冻结状态变为可运行状态 (中断--是一种冻结状态)
中断状态被清除:线程状态由冻结变为可执行状态
interrupt方法--会抛出InterruptedExcption(在线程不该醒来的时候叫醒线程)-记得要处理

该异常。在catch里面修改标记
notify--只能唤醒wait的方法
interrupt--强制的唤醒-一定会出现中断异常
eg:一个kiss叫醒--notify
一棒打醒---interrupt
结束进程:其实就是强制的将进程里面的线程都结束并释放该片内存空间
系统级的进程用户不能进行结束

----线程中其他常见线程方法----
setDaemon()将线程设为守护线程,正在运行的所有线程都是守护线程,JVM停止运行
使用时机:在启动线程前调用
后台线程:开始运行相同,结束不同,前台线程必须手动结束,后台线程可以在前台线程都

结束后,自动结束。后台线程依附于前台线程。
join();线程调用该方法后(在主线程中调用),主线程释放执行权和执行资格,让该线程执行

完后,该线程正常终止,主线程获得执行资格再和其他线程夺取执行权
一般用于临时加入线程--运算
setPriority():设置线程优先级;并不是优先级越高就一定先执行,而是被执行的概率大一

些,1-10,把常见的优先级1,5,10定义为静态常量。
toString():线程对象具备对应的字符串表现形式
yield():主动释放一次执行权,下次的时候会和其他线程夺取执行权-静态方法
创建线程的快捷方式:使用匿名内部类

时间: 2024-11-20 12:31:20

Java基础总结--多线程总结2的相关文章

【BigData】Java基础_多线程

所谓的多线程就像小吃街卖铜锅米线的老板,老板就好比一个操作系统,如果5个顾客同时去买米线,那么,此时老板就会同时准备好5个铜锅,然后同时放上水.调料.米线,同时煮5个人的米线,如果逐个煮的话,那么估计煮了2个人的米线,后面3人就来找老板退款了. 官方解释:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术 在Java中实现多线程四部曲: (1)将需要用多线程方式执行的逻辑,写入一个runnable实现类中(run方法中): (2)创建出这个runnabl

Java基础4——多线程

线程依赖于进程而存在 进程:正在运行的程序 是操作系统进行资源分配和调度的独立单位 每个进程都有自己的内存空间和系统资源 多进程的意义:单进程的计算机只能做一件事情 DOS窗口就是典型的单进程 多进程的计算机可以在一个时间段内执行多个任务 单核CPU在某个时间点只能执行一件事情,事实上CPU一直在高效切换各个进程 线程:一个进程内可以执行多个任务,每个任务可以看成是一个线程,线程是程序(进程)的执行单元或执行路径,是程序使用CPU的最小单位 多线程的意义:提高应用程序的使用率 程序的执行都是在抢

3.8 java基础总结①多线程

多线程 多线程这章理论大于实践,因为在实际开发中多线程的都封装到框架里边了的,程序员一般不会写多线程,多线程属于Java里边比较底层的代码了. 线程是处理器调度的最基本单位程序>进程>线程程序是死的,当启动程序得时候会有一个或几个进程,每个进程里边可以有诺干线程.基于线程开销更 创建线程:两种方法1.声明Thread的子类,重写run方法class MyThread extends Thread{ public void run(){ }}Mythread a = new MyThread()

Java基础知识—多线程编程(五)

概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源,提高工作效率. 线程生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 就绪状态: 当线程对象调用了start()方法之后,该

java基础之多线程

参考博客 http://www.mamicode.com/info-detail-517008.html 1.进程和线程的区别 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行. 2.实现R

java基础及多线程

1.多线程 1.1.进程与线程 ? 进程就是一个运行中的程序. ? 一个进程中可以有多个线程,线程是CPU调度和分派的基本单位.我们可以理解为线程就是程序运行中的一条路径. 1.2.多线程的创建及使用 1.2.1.创建 自定义一个类继承Thread类或实现Runnable接口 1.2.2:两种创建多线程的区别 继承Thread类:Thread()或Thread(String name) 多个线程分别完成自己的任务 实现Runnable接口:Thread(Runnable target) 或Thr

java基础07 多线程

在学习操作系统时,我们会学习进程和线程,那么进程和线程又是什么东西呢? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程(thread)是操作系统能够进行运算调度的最小单位. 它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. Java程序运行原理 java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一

黑马程序员-Java基础之多线程

多线程 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺序. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量. jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数.主线程执行的代码都在main方法中. 当产生垃圾时,收垃圾的动作,

【黑马程序员】-Java基础学习-多线程

------- android培训.java培训.期待与您交流! --------- 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行.