线程.docx
《线程.docx》由会员分享,可在线阅读,更多相关《线程.docx(11页珍藏版)》请在冰豆网上搜索。
![线程.docx](https://file1.bdocx.com/fileroot1/2023-1/25/f1bab0b0-208e-4e0f-a5f8-e25cb7b333f1/f1bab0b0-208e-4e0f-a5f8-e25cb7b333f11.gif)
线程
线程
1.进程
2.线程
3.多线程开发的优势
4.定义一个线程
5.线程的状态
6.线程的优先级
7.join()方法
8.sleep()方法
9.yield()方法
10.setDaemon()方法
11.线程同步
1.同步方法
2.同步代码块
3.死锁
12.线程之间相互通信
1.进程:
每一个进程都对应了操作系统中的一个执行实例。
进程就是应用程序的执行实例,只有当这个应用程序执行的时候,他才成为进程。
特点:
1.动态性(动态产生,动态消亡)
2.并发行(系统中的所有进程都可以与其他进程并发执行,CPU通过时间片轮转来实现)
3.独立性(进程是一个可独立运行的基本单位,也是系统分配资源和进行调度的独立单位)
2.线程:
进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。
(所有的线程都是java.lang.Thread类或其子类的一个实例)
特点:
1.一个进程可包含多个线程,一个线程至少要有一个父进程。
2.线程可以有自己的堆栈,程序计数器和局部变量
3.线程与父进程的其他线程共享进程所有的资源。
4.独立运行,采用抢占资源方式。
5.一个线程可以创建和删除另外一个线程(例如主线程)
6.同一个进程中的多个线程之间可以并发执行。
7.线程的调度管理是由进程来完成的。
主线程:
一个进程的入口。
注意:
在编写多线程程序的时候,编写的线程不会妨碍同一进程的其他线程。
线程分类:
1.系统级线程(又称为核心级线程,负责管理调度不同进程之间的多个线程,由操作系统直接管理)。
2.用户级线程(全部由用户来控制,运行时不需要特殊的系统支持,仅存在于用户空间,在应用程序中控制其创建,执行,消亡)
3.多线程开发的优势
1.改善用户体验
2.提高资源利用率
4.定义一个线程
1.继承java.lang.Thread类
1.定义Thread类的子类,重写父类的run()方法
2.创建Thread子类的对象
3.调用start()方法启动该线程
2.实现java.lang.Runnable接口
1.定义Runnable接口的实现类
2.用newThread(Runnable)的方法创建线程对象
3.调用start()方法启动该线程
5.线程的状态
6.线程的优先级(默认继承父线程的优先级)
7.join()方法
作用:
阻塞指定的线程等到另一个线程完成以后再继续执行
例:
A和B线程,如果在A的run方法中,调用b.join()。
它的意思是说,把A加入到B的末尾,等B执行完A在执行。
8.sleep()方法(Thread.sleep(longmillis));
作用:
阻塞当前线程,让其他线程来强张资源(不考虑他们的优先级)。
9.yield()方法(语法:
Thread.yield();)
作用:
将(被暂时停止运行)当前线程转入可运行状态,这个线程任然可以和其他等待执行的线程竞争处理器资源(考虑他们的优先级)。
10.setDaemon()方法(线程对象.setDaemon(booleanon);)
作用:
通过给.setDaemon()传递booleanon参数,来指定线程是否为后台线程(后台线程也称守护线程)。
后台线程:
就是一个在后台运行的线程,它从属于创建它的线程,因此当创建后台线程的线程结束时,后台线程也随之消亡。
注意:
除了后台线程,其他线程都是用户线程。
只能在线程启动之前将此线程设为后台线程,而不能再启动之后。
11.线程同步(多线程之间同步是由“锁”来实现的)
同步的作用:
当多个线程访问同一个资源时,只能有一个线程可以访问该资源,其他线程只能等待该线程使用完这个资源后才能使用。
“锁”内容:
在java语言中,每个对象都有一个内置的“锁”。
这个“锁”平时不会起到任何作用,只有在这个对象中存在着同步代码块的时候,这个“锁”才会发挥作用。
当我们执行一个非静态同步方法时,就会自动获得当前对象的“锁”,这个“锁”只能被一个同步方法或同步代码块获得。
获得当前对象的“锁”也称锁住了当前对象(同步当前对象)。
1.同步方法(同步this关键字指向的对象的“锁”)
语法:
访问修饰符synchronized返回值类型方法名(),
或synchronized访问修饰符返回值类型方法名()
注意:
第一点:
两个线程不能同时访问同一个对象中标注为同步的方法,但对于对象中没有标注synchronized关键字的方法是没有约束的。
第二点:
同步一个方法对在同一个对象中是有做用到,对同一类的不同对象起不到同步的作用。
2.同步代码块(“锁”可以是任何存在的对象的“锁”)
语法:
synchronized(指定要收益的对象){同步语句块}
3.死锁
12.线程之间相互通信
wait()方法:
(挂起当前线程,并且释放共享资源的锁)
notify()方法:
(调用notify()方法可以唤醒因为调用wait()方法而挂起的那个线程,使这个线程退出阻塞状态而进入可运行状态。
如果没有任何等待的线程notify()就什么也不做。
)
notifyAll()方法:
(可以使所有因调用wait()方法而被挂起的线程都重新启动,条件:
wait()方法和notifyAll()方法要属于同一个对象。
)
注意:
1.这三个方法都是在java.lang.Object类中定义的。
2.只能在同步方法或同步代码块中使用(synchronized),否则就会抛出异常。
生产者生产一个商品,放入仓库并告诉消费者仓库以存有商品,消费者将商品取走,并告诉生产者商品以消费。