Skip to content

Latest commit

 

History

History
155 lines (143 loc) · 4.52 KB

多线程.md

File metadata and controls

155 lines (143 loc) · 4.52 KB

较为详细扩展的文章可参见这篇博客: https://blog.csdn.net/qq_34337272/article/details/79640870

一、线程定义

线程是进程中执行运算的最小单位,是进程内部的一个执行单元 1、多个线程同时进行,采用枪占的机制,单核计算机一个时间只有一个线程执行,采用枪占资源的方式

二、多线程的优势

1、最大限度的提高计算机系统的利用效率 2、充分利用网络和系统资源

三、主线程

main方法为主线程入口 主线程必须最后执行

四、创建线程

1、继承Thread类 重写run方法 测试中只需要创建线程对象即可 2、实现Runnable接口 测试诶中创建线程时候,需要 Thread thread=new Thread(m,name); m为线程类的实例 name为此线程的名字

两种方法的区别 Thread方法较简单,适用于单继承 Runnable很好的避免了java中的单根继承,并且使用这种方法可以共享数据资源。

五、线程的状态

1、新生(创建) new但是还没调用start方法 2、就绪 调用了start方法,但是未抢到CPU的资源 3、运行 执行run方法 4、阻塞 是一种不可运行状态,造成阻塞的原因: *执行Thread.sleep()方法 *IO操作时,IO操作未完成 *需要得到琐,但是琐被占用 5、死亡 退出main方法

六、线程调度

1、线程优先级 ①设置优先级 setPriority(int guid) ②1-10表示优先级,10最高,5为默认,每一个优先级对应Thread的一个公用静态常量 NORM_PRIORITY=5 MIN_PRIORITY=1 MAX_PRIORITY=10 线程的优先级只是表示一个抢到资源的概率,不一定每次优先级高的都先运行,只是表示有这种可能性 2、实现线程调度的方法 ①sleep 静态方法 要用Thread.sleep(1000);括号内为毫秒数 强制让线程休眠 ②join 非静态方法 线程名.join(); 谁调用join方法,该线程就先执行完,也有可能出现要加入的线程在未达到join条件时就已执行完毕,这时候join就不起作用了。 ③yield 静态方法 Thread.yield 线程的礼让 可以让当前线程暂停执行,允许其他线程执行,但该线程任然可运行状态,此时,系统选择其他或更高优先级的线程执行,如无其他,则该线程继续执行,

七、线程同步

高并发安全性问题:马上双十一了,很多多人同一时间点会访问同一数据,这时候线程安全就很重要了 线程同步: 所谓线程同步就是当两个或多个线程要访问同一资源时,需要以某种顺序来确保某一时刻只能一个线程使用的方式 1、同步代码块 在访问修饰符前或后加synchronized,比如这个例子

package demo4;
/*
 * 线程同步测试
 * 1、同步代码块
 */
public class MyThread implements Runnable {
	private int count=10;//显示余票
	private int piao;//显示抢到几张票
	@Override
	public void run() {
		while(true) {
			synchronized (this) {
				if (count <= 0) {
					break;
				}
				count--;
				piao++;
				//模拟网络延迟
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "抢到弟" + piao + "张票,剩余" + count + "张票!");
			}
		}
		
	}
	
}

注意:eclipse自动生成同步代码块的快捷键 右键——Surround with——synchronized... 2、同步方法

package demo5;
/*
 * 线程同步测试
 * 2、同步方法
 */
public class MyThread implements Runnable {
	private int count=10;//显示余票
	private int piao;//显示抢到几张票
	boolean flag=true;
	@Override
	public void run() {
		while(flag) {
			buy();
		}
	}
	synchronized public void buy() {
		
		if (count <= 0) {
			flag=false;
			return;
		}
		
		//模拟网络延迟
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		count--;
		piao++;
		System.out.println(Thread.currentThread().getName() + "抢到弟" + this.piao + "张票,剩余" + this.count + "张票!");
	}
	
}

注意:并不是同步的代码越多越好,容易出现死锁现象

线程同步涉及的类和方法(重要)

1、ArryLit类的add方法:是非线程同步,不安全的 2、StringBuffer同步安全 StringBuilder非同步,不安全 3、线程安全的:能同步,共享资源,安全 非线程安全:效率高 4、HashMap:建只能有一个为空,值不能为空,不安全 Hashtable:键值都不允许为空,安全