第十五天日常更新---多线程

今天接着更新多线程的知识

多线程:

多个任务同时执行就是多线程,如果不需要多任务,就不需要开启多线程
优点:资源利用率更好;程序设计在某些情况下更简单;程序响应更快

进程:对与操作系统而言就是不同的任务执行,每一个进行都有自己的代码和数据空间,进程之间切换消耗比较大,一个进程中包含一刀多个线程,是资源分配的最小单位
线程:一系列线程共享代码和数据空间,线程之间切换消耗较小,线程是cpu调度的最小单位

三高: 高可用(数据不会出错) 高性能(用户体验度好) 高并发(多用户同时操作抢购)
关注重点:
1.多线程的创建方式
1)继承Thread类 重写run()方法
2)实现Runnable接口,重写run()方法 --推荐
3)实现Callable接口,重写call()方法–了解 juc
2.保证线程安全问题 同步
3.线程状态

继承Thread类 重写run()方法

开启线程:Thread->start()开启线程

public class ThreadDemo01 extends Thread{
	//在run()方法中定义多线程的线程体
	@Override
	public void run() {
		for(int i=0;i<=100;i++){
			System.out.println("一遍哄女朋友-.-");
	}
}
public static void main(String[] args) {
	//开启多线程
	//创建一个线程对象
	ThreadDemo01 th=new ThreadDemo01();
	//	th.start();  //开启线程 等待cpu调度
	th.run();   //调用方法,执行方法中的代码,执行完毕继续向下执行,这是单线程不是多线程		
	for(int i=0;i<=100;i++){
		System.out.println("一遍敲代码^~^");
	}
}
}

2

)实现Runnable接口,重写run()方法 --推荐

好处:避免带线程的局限性 实现资源共享
开启线程:使用Tread类中的start()方法开启 (静态代理

public class ThreadDemo02 implements Runnable{
public static void main(String[] args) {
	ThreadDemo02 th=new ThreadDemo02();
	new Thread(th).start();
	for(int i=0;i<=100;i++){
		System.out.println("一遍说话^~^");
	}	
}
@Override
public void run() {
	for(int i=0;i<=100;i++){
		System.out.println("一遍吃饭^~^");
	}
}
}

第三种开启多线程的方式:

实现Callable接口,重写call方法
优点:可以抛出异常,可以存在返回值
缺点:使用麻烦

线程的状态:
新生状态 : new,每个线程都有自己的运行空间
就绪状态 : start(),就绪不代表运行,代表线程具有可运行的能力,在就绪队列中排队等待cpu调度
运行状态 : cpu把时间片分配给某个线程,这个线程就就行运行状态
阻塞状态 : sleep()…
终止状态 : 执行完毕

注意:
1)一个线程一旦进入到阻塞状态,阻塞解除无法直接回复运行状态,进入就绪状态等待cpu的调度
2)一旦一个线程以终止,无法恢复,如果创建开启,也是新的线程

终止状态的几种情况:
1)正常执行完毕
2)强制结束 stop(),destroy(),方法已过时,不推荐使用
3)通过标识进行控制–推荐

进入就绪状态的情况:
1.start()
2.阻塞状态结束
3.yield()
4.线程切换,被切换的线程进入到就绪状态

进入阻塞状态的情况:
1.sleep()
2.wait()
3.join() 插队
4.IO操作

sleep方法:
1.方法问题的可能性
2.模拟网络延时

yield()方法
高风亮节 礼让线程

线程的状态Thread.State getState()

void setPriority(int newPriority) 更改线程的优先级。
1~10 最小是1 最大是10 默认5
MAX_PRIORITY -->10
MIN_PRIORITY -->1
NORM_PRIORITY -->5
getPriority() 获取线程优先级别

线程安全问题:
多线程同时操作同一份资源的时候,有可能出现线程不安全问题

处理线程安全:
同步锁 synchronized
同步方法: 效率较低,简单
同步静态方法
同步成员方法
同步块: synchronized(this|类名.calss|资源(成员属性)){…}

注意:
1.锁一定要锁不变的内容 自定义类型对象地址
2.锁的范围太大,效率低,锁的范围太小锁不住

double check 双重检查 效率高,锁的范围小
锁静态方法,锁类的class对象都是锁类,锁住了这个类的所有对象

锁方法
锁this:锁住对象所有的资源(成员属性),如果只想锁住某一个资源,那就可以直接就锁资源

锁资源,效率较高
注意:一定要锁不变的资源内容
资源变成自定义类型–>锁对对象的地址肯定不变

线程通信:wait 和 notify和notifyAll() -->同步环境下使用 否则:IllegalMonitorStateException
生产者消费者模式
wait():使线程进入等待序列,释放对象锁,让出cpu的资源
notify和notifyAll():唤醒对方处于等待序列的线程,具有可运行的能力,并且要获取对象的锁和cpu的资源才能运行,如果被唤醒的线程没有获取对象锁无法执行

猜你喜欢

转载自blog.csdn.net/weixin_45116848/article/details/92015011