`

黑马程序员_多线程

阅读更多

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

进程
进程是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程
就是进程中的一个独立的控制单元,线程在控制着进程的执行。一个进程至少有一个线程。

jvm启动时,会有一个进程java.exe。该进程中至少有一个线程负责java程序的执行。
而且这个线程运行的代码存在于main方法中,该线程称之为主线程。
其实更细节的说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。

创建线程的两种方式
继承Thread

//继承Thread创建线程
class MyThread extends Thread
{
	public void run()
	{}
}
//开启线程
new MyThread().start();



实现Runnable接口

//实现Runnable接口
class ImplRunnable extends Runnable
{
	public void run()
	{
		
	}
}
//开启线程
new Thread(new ImplRunnable).start();



多线程的安全问题
当多个线程在访问同一个共享数据时,会产生安全隐患,一个线程对数据访问还没有结束,另一个线程就开始访问共享数据,导致共享数据错误。

解决办法
对多个线程访问同一个共享数据,只能让一个线程访问完毕后,其他线程在访问,在线程访问时其他线程不允许访问。
java对于多线程的安全问题提供了专业的解决方式,同步代码块。

同步代码块

synchronized(对象)
{
	//需要被同步的代码;
}


对象如同同步锁,持有锁的线程可以在同步中执行。
典型例子:毕向东老师说的,火车上的卫生间。

同步的前提
1.必须要有两个或者两个以上线程。
2.必须是多个线程使用同一个锁(类的class文件对象在内存中唯一的,唯一锁)
   必须保证同步中能有一个线程在运行

 

同步的好处和弊端
同步的好处:解决了多线程的安全问题
同步的弊端:多个线程需要判断锁,较为消耗资源。

如何查找安全问题
1.明确哪些代码是多线程运行代码
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的

同步的两种形式
1.同步代码块(对象锁)
2.同步函数(this对象锁)
静态函数的函数锁是class,因为静态函数不可以定义this,它使用的是该方法所在类的字节码对象,静态进内存时,内存中没有本类对象,但是一定有该类对于的字节码文件对象类名.class它的类型是Class。

死锁
同步嵌套同步,而锁却不同,例如同步A需要A锁,同步B需要B锁,一个线程持有A锁,另一个线程持有B锁,A同步块要进入B同步块,同时B同步要进入A同步块,可能都没有释放所,就会出现死锁,程序停止那里不动了。

/*
实现Runnable的Test类
*/
class Test implements Runnable 
{
	private boolean flag;
	Test(boolean flag)
	{
		this.flag = flag;
	}

	public void run()
	{
		if(flag)//如果true执行if的同步代码块
		{
			synchronized(MyLock.locka)
			{
				System.out.println("if...locka");
				synchronized(MyLock.lockb)
				{
					System.out.println("if...lockb");
				}
			}
		}
		else//如果false执行else中的同步代码块
		{
			synchronized(MyLock.locka)
			{
				System.out.println("else...locka");
				synchronized(MyLock.lockb)
				{
					System.out.println("else...lockb");
				}
			}
		}
	}
}
/*
要用到对象锁locka和lockb
*/
class MyLock
{
	static Object locka = new Object();
	static Object lockb = new Object();
}
/*
死锁测试
*/
class DeadLockTest
{
	public static void main(String[] args)
	{
		//开启两个线程让他们争夺cpu执行权,查看可能出现的死锁情况
		Thread t1 = new Thread(new Test(true));
		Thread t2 = new Thread(new Test(false));
		t1.start();
		t2.start();
	}
}



多线程等待唤醒机制图解 



 
 同步方法
wait:让线程处于等待状态,直到被notify或notifyAll唤醒,会释放对象锁。

notify:唤醒等待中的线程,通常是线程池中第一个等待线程。用于两个线程交互

notifyAll:唤醒线程池中所有等待线程。用于多个线程交互。

线程池

等待状态的线程都在内存中的线程池中。

注意:

wait、notify、notifyAll都是用在同步中,因为对持有监视器(锁)的线程操作。

为什么线程操作方法要定义在Object类中?

因为这些方法在操作同步线程时,都必须要标识他们操作线程的持有锁。只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,也就是说等待和唤醒必须是同一个锁,而锁可以是任意对象,所以定义在Object类中。

 

如何停止线程?

stop方法已过时,不再被使用。如何结束线程只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构只要控制住循环就可以让run方法结束,也就是线程结束。

 

特殊情况

当线程处于冻结状态,就不会读取到循环标记,那么线程就不会结束。当没有指定的方式让冻结的线程恢复到运行状态时,这时就需要对冻结进行清除(interrupt方法 ),强制线程恢复到运行状态中来,这样就可以在cathc中操作标记让线程结束。

 

守护线程

public final void setDeamon(boolean on)将该线程标记为守护线程或用户线程。

当正在运行的线程都是守护线程时JVM退出。该方法必须在启动线程前调用

 

什么时候使用守护线程?

当该线程依赖于其他线程时,其他线程结束后它就没有存在的意义。标记为守护线程。

 

Join方法

当A线程执行到B线程的join方法时,A就会等待B线程执行完,A才会执行,join可以用来临时加入线程执行(当满足条件时)。

 

yield方法

暂停当前正在执行的线程对象,并执行其他线程。使线程交替执行,减少某个线程频繁执行的频率。

 

 


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

  • 大小: 2.4 KB
分享到:
评论

相关推荐

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    黑马程序员_张孝祥_Java多线程与并发库,视频+代码+资料

    黑马程序员_张孝祥_Java多线程与并发库

    黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.

    多线程高新(黑马程序员)

    NULL 博文链接:https://lvwenwen.iteye.com/blog/1470696

    黑马程序员-java多线程技术01

    NULL 博文链接:https://huangminwen.iteye.com/blog/1157983

    java并发库高级应用源码--张孝祥

    java并发库thread使用,传统线程技术、定时器技术、线程互斥技术,同步通讯技术、多线程共享数据、并发库应用,线程锁技术,阻塞锁、阻塞队列,线程池等应用

    黑马程序员–Java多线程讲解笔记

    当一个进程中线程有多个时,是多线程。  为什么要用多线程  1,让计算机"同时"做多件事情,节约时间。  2,后台运行程序,提高程序的运行效率.。  3,多线程可以让程序"同时"处理多个事情。  4,...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

    传智播客_Java培训_毕向东_Java基础[05-多线程]

    传智播客_Java培训_毕向东_Java基础[05-多线程]系黑马程序员_毕向东_Java基础视频教程

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量...

    java拼图游戏源码.zip

    这是一个java写的拼图游戏,用了swing、多线程等知识,可以设置行数列、列数、还有使用多线程写的游戏动画,拼图的图块具有磁贴设计,代码封装性较强,容易移植,纯原创。

    图解java多线程设计模式

    日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与多线程和并发处理相关的12种设计模式。每章附带练习题和答案,...

    图解java多线程设计模式2017年8月最新版

    精选12种与多线程和并发处理相关的设计模式 264张图表 + 300段Java示例程序 = 轻松学习多线程编程 日本经典多线程入门书,原版长销11年! 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java编程感兴趣的人 c.对...

    8天快速掌握Android系列视频之04_开发与 运行(卸载)第一个ANDROID应用

    黑马程序员_8天快速掌握Android视频 总共67个视频教程,包括:02_搭建Android开发环境,03_创建与启动手机模拟器和学习使用ANDROID操作系统,04_开发与 运行(卸载)第一个ANDROID应用,05_项目的目录结构与安装及...

    8天快速掌握Android系列视频之07_查看应用输出的错误信息 与如何部署应用到真实手机

    黑马程序员_8天快速掌握Android视频 总共67个视频教程,包括:02_搭建Android开发环境,03_创建与启动手机模拟器和学习使用ANDROID操作系统,04_开发与 运行(卸载)第一个ANDROID应用,05_项目的目录结构与安装及...

    拼图游戏 (源码+所有文件)

    萌新做的一个简单的Java拼图游戏 启动类:pers.sept.jigsaw1.swing下的...多线程。 下拉列表选择数字可以切换关卡图片,最后的“+”,可以添自己的图片到关卡中。 设有背景音乐 有一键通过按钮 等等,块下载去看看吧。

    图解java多线程设计模式 2017年8月最新版

    这本书的pdf文件有162M,是最新版高清的pdf,网上原书售价60多元,这里提供的附件是百度云的链接地址。

    《Java基础案例教程(第2版)》课后习题答案1

    第1章 Java开发入门一.填空题1. 面向对象,SUN 2. JavaSE,JavaEE,JavaME3.面向对象、跨平台性、支持多线程4. JDK5.bin

    JAVA核心知识点整理.pdf

    给大家分享一篇我在学习java过程中...包含常见的面试题:JVM、Java集合、多线程并发、java基础、SSM框架原理、微服务、Netty和RPC、网络、日志、算法、数据结构、加密、分布式算法、机器学习、大数据等知识点,都是干货

    mfc教程(word版)

    4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 ...

    黑马JVM学习笔记二

    title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 ...线程是私有的,多线程之间分别有各自的程序计数器记录对应线程的执行位置 程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢

Global site tag (gtag.js) - Google Analytics