多线程

1.多线程
程序(Program):代码的集合;程序是静态的;
进程(Progress):程序的一次执行(运行着的程序),它是动态的;
线程(Thread):进程中可以并行执行的小任务(迅雷,QQ);
只要启动java虚拟机,就会为我们创建一个线程来执行,这个线程叫主线程;
java创建线程的方式
Thread类
Runnable接口;
Callable接口(juc)
线程池;(juc)
Thread类
Thread代表一个线程,Thread中有一个run方法,这个方法是线程体;这个方法中判断target是否为空,不为空则运行Runnable.run,否则什么都不执行;

Thread中常用方法
run():执行线程体
start():启动线程;
sleep():休眠的毫秒数,这是一个静态方法;
yield():让当前线程让步;当前线程进入就绪态
join():等待当前线程终止,才继续运行主线程;
getId():获得线程的唯一标识;
getName():获得线程名
currentThread():获得当前代码所在的线程的引用;

用Thread创建多线程的常用步骤
定义一个类(A),来继承Thread, 同时重写run方法
创建线程对象 (A a=new A();)
启动线程(a.start())
线程的生命周期
新生 -》就绪-》运行-》阻塞-》消亡
Runnable接口;
多线程的第二种实现方式;
定义一个类,实现Runnable接口;重写run方法;
定义一个Thread(Runnable ),将Runnable作为参数传递给Thread
当多个线程对同一个资源(对象,变量)进行操作时,可能会引发线程安全的问题 ;
资源竞争的问题;
当多个线程试图访问一个资源时,可能会出现资源竞争的问题,我们可以通过同步锁来解决此问题,即将访问资源的代码放在一个同步块或同步方法中;当需要执行此代码时,必须先得到锁才能执行;如果得不到锁,则不能执行,只能将线程放在锁池中等待其它线程释放锁;

使用同步块和同步方法可以解决线程并发时遇到的安全问题;同步块的语法如下;
synchronized(monitor){

}
monitor可以是任何对象,要想运行同步块中的代码,必须先获得monitor,同一时刻只能有使用同一个monitor的一个线程获得nonitor对象,块中的代码执行完毕后,monitor会自动释放;
同步方法中使用的monitor是this;

如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为Java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。
关于成员变量与局部变量:如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程)。

线程8锁
/**
*
* 1.两个普通同步方法,两个线程 ,标准打印,打印?顺序打印
* 2.新增Thread.sleep(3000) 给getOne() 打印? after 3s one two
* 3.新增普通方法 getThreee 打印?three atter 3s one two
* 4.两个普通同步方法,两个number对象,打印? two after 3s one
* 5.修改getOne()为静态同步方法,一个number对象,打印? two after 3s one
* 6.修改两个方法均为静态同步方法,一个number对象,打印?after 3s one two
* 7.修改getOne()为静态同步方法,getTwo()为非静态同步方法 ,两个number,一个调用one,一个调用two? two after 3s one
* 8.两个都改为静态同步方法,两个number 一个调用getOne(),一个调用getTwo() after 3s one two
*
*/
守护线程
守护线程是优先级比较低的线程,如果进程中只有守护线程还在运行,那么操作系统不会等待守护线程运行结束;gc就是一个守护线程;
Thread.setDaemon();
线程的优先级;
setPriority()来进行设置,最大优先级是10,最小为1;优先级越高,越优先执行;
线程之间的通讯
Object类的三个方法;这三个方法一定要在synchronized中使用;
wait():让当前线程阻塞,直到使用同一把锁的其它线程使用notify,notifyAll对其进行唤醒;
notify():唤醒wait池中的一个线程;使其进入到锁池状态;
notifyAll():唤醒wait池中的所有线程;
wait与sleep的区别?
wait是Object的方法,而sleep是Thread的方法
sleep是阻塞一段时间后,然后进入到就绪态,而wait是进入到等待队列(也是一种阻塞),直到使用了同一个锁对象的线程调用 notify或notifyAll方后才会被唤醒;
wait只能在同步块或同步方法中使用,而sleep不需要;
sleep不会释放锁,而wait方法会释放锁;
线程生命周期转换图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值