基本概念:
●程序(program):为完成特定任务、用某种语言编写的一组指令。即指一段静态的代码
●进程(process):程序的一次执行过程,或是正在运行的一个程序
●线程(thread):进程可进一步细化为线程,是一个程序内部的一条执行路径
注意:程序是静态的,进程是动态的。若一个程序可同一时间执行多个线程,就是支持多线程的
------------------------------------------------------------------------------------------------------------------
何时需要多线程:
● 程序需要同时执行两个或多个任务
● 程序需要实现一些需要等待的任务时(如用户输入、文件读写操作、网络操作、搜索等)
● 需要一些后台运行的程序时
------------------------------------------------------------------------------------------------------------------
使用多线程的优点:
● 提高应用程序的响应。对图形化界面更有意义,可增强用户体验
● 提高计算机系统CPU的利用率
● 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
------------------------------------------------------------------------------------------------------------------
线程的分类:(守护线程、用户线程)
● 它们在几乎每个方面都是相同的,唯一的区别是判断JVM何时离开
● 守护线程是用来服务用户线程的,在start()方法前调用thread.setDaemon(true)可以把用户线程变成守护线程
● Java垃圾回收就是一个典型的守护线程
● 若JVM中都是守护线程,当前JVM将退出
------------------------------------------------------------------------------------------------------------------
Thread类:(JVM允许程序运行多个线程,它通过java.lang.Thread类来实现)
构造方法:
●Thread():创建新的Thread对象
●Thread(String threadname):创建线程并指定线程实例名
●Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法
●Thread(Runnable target, String name):创建新的Thread对象
------------------------------------------------------------------------------------------------------------------
创建多线程的两种方式:(Thread、Runnable)
继承Thread类:
实现Runnable接口:
区别:
●继承Thread:线程代码存放Thread子类run方法中
●实现Runnable:线程代码存在接口的子类的run方法
实现方法的好处:
● 避免了单继承的局限性
● 如果多个线程要操作同一份资源,更合适使用实现的方式
注意点:启动线程只能使用start()方法,不能调用run()方法。一个线程对象只能start()一次
------------------------------------------------------------------------------------------------------------------
线程的常用方法:
● start(): 启动线程,并执行对象的run()方法
●run(): 线程在被调度时执行的操作
●getName(): 得到当前线程的名字
●setName(String name):设置该线程名称
●Thread.currentThread():静态的,获得当前线程对象
● getPriority():返回线程的优先值,默认值为5,取值范围1-10
●setPriority(int newPriority):设置线程的优先级。值越高优先级越高
●yield():释放当前线程对象的CUP执行权限
●join():在A线程中调用B线程的join(),表示当执行到此时,停止A,直至B线程执行完毕,A线程再执行
●isAlive(): 判断当前线程是否还活着
●sleep(long l):显示指明当前线程睡眠L毫秒
●wait():释放当前的锁,然后让出CPU,进入等待状态
●notify():唤醒处于等待状态的线程,然后继续往下执行(唤醒一个)
●notifyAll():唤醒处于等待状态的线程,然后继续往下执行(唤醒所有)
注意:wait()、notify()、notifyAll()属于Object基础类,不属于Thread类。一般配合synchronized方法或代码块使用,否则会报异常(IllegalMonitorStateException)
------------------------------------------------------------------------------------------------------------------
线程的生命周期:
●新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
●就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件
●运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能
●阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态
●死亡:线程完成了它的全部工作或线程被提前强制性地中止
------------------------------------------------------------------------------------------------------------------
线程的同步:(解决多线程的安全问题。线程安全是出现在当有多个线程同时操作共享资源时发生的)
●缘由:当一个线程在操作数据时,还没执行完,另外一个线程参与进来执行。导致共享数据的错误
●解决:如果共享数据已被一个线程占用,那么就不允许其他线程参与进来
同步代码块:
同步方法:
注意:在多线程中同步监听器是唯一的。在实现的方式下,监听器可以使用this。在继承的方式下,同步方法的监听器为this
------------------------------------------------------------------------------------------------------------------
释放锁的操作:
● 同步方法(代码块)执行结束
● 同步方法(代码块)中遇到break、return终止了继续执行
● 同步方法(代码块)中出现了未处理的Error或Exception,导致异常结束
● 同步方法(代码块)中执行了线程对象的wait()方法,当前线程暂停,并释放锁
不会释放锁的操作:
● 执行同步方法(代码块)时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行
● 执行同步方法(代码块)时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁
注意:应尽量避免使用suspend()和resume()来控制线程
------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知