进程的定义:
是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.(进程一个应用程序)
进程是程序(操作系统)运行资源分配的最小单位。资源包括:CPU,暖场空间等,统一进程中的许多线程共享该进程中的全部系统资源,进程与进程是相互独立。进程是系统进行分配和调度的一个独立单位。
线程的概念
在一个程序中同时运行的多个独立流程,每一个独立的流程就是一个线程
线程是CUP调度的最小单位,必须依赖于线程而存在
线程是 进程的一个实体,是CUP调度和分派的基本单位。它是比进程更小的,能独立运行的基本单位。线程自已基本上不拥有系统资源,只用拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)
线程无处不在。任何一个程序都必须要创建线程
多线程的概念:
一个进程中至少有两个或者两个以上的线
线程的3要素(CPU,CODE,DATE)
多线程的好处:提高工作效率,改善用户的体验
线程开发的两组方式
第一种方式
- 通过继承Thread的方式
2 .继承Thread类,并重写run方法实现线程的开发
3.调用线程的start方法:启动线程,调调run()方法
- public class MyThread extends Thread {
- @Override
- public void run() {
- for (int i = 0; i < 10; i++) {
- System.out.println("第一个线程的内容:" + i);
- }
- }
- }
-
-
- public static void main(String[] args) {
- // 创建一个线程对象
- MyThread myThread = new MyThread();
- // 启动线程 启动线程不能直接调用run 只能调用start
- myThread.start();
线程的使用创建线程对象,调用线程的start方法
不能直接调用线程的的run方法,否则就不是一个线程对象了
第二中方法
实现Runnable接口来实现
- public class MyRunnable implements Runnable {
- @Override
- public void run() {
- for (int i = 0; i < 100; i++) {
- System.out.println("第二个线程:" + i);
- }
- }
- }
- public static void main(String[] args) {
- // 创建第二个线程Runnable需要依赖一个Thread对象才可以
- MyRunnable myRunn = new MyRunnable();
- Thread thread = new Thread(myRunn);
- // 启动线程 启动线程不能直接调用run 只能调用start
- thread.start();
- }
-
实现了runnable接口的类只能说具有了线程的功能,不能说是一个线程,所以创建对象的时候必须依赖一个真实的线程对象
线程的状态
初始状态(创建了对象)
可运行状态(调用了start方法)
运行状态(调用了run方法)
阻塞状态 (调用了seleep,join,wait方法)
终结状态 (运行完毕)
线程的常用方法
Start() 启动方法 表示线程进入了可运行状态
Seleep(int) 随眠方法,当前线程进入阻塞状态,在一定时间以后苏醒
Join() 方法 被调用者优先执行,执行完毕后当前线程在执行
Wait() 方法 当前线程进入阻塞状态,一直到对方唤醒自己才可以继续执行
notifyAll()唤醒被阻塞的线程
需要注意:wait(),notify()两个方法是Object类提供的
线程优点:
1. 加大了资源的利用效率
2. 可以多个任务同时执行
线程缺点:
1. 降低了线程被执行的概率
2. 消耗CPU资源过大
3. 容易造成数据不安全
4. 死锁
线程的死锁
如果两个线程同时调用对方线程的JOIN方法,互相希望对方先运行就会出现死锁的问题
为解决线程之间安全性引入Java的索机制,而一不小心就会产生Java线程死锁的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。