应用程序开发——多线程(Thread、Runnable、synchronize)
2018-03-30 18:25
281 查看
基本概念:
● 程序(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()来控制线程
------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知
● 程序(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()来控制线程
------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知
相关文章推荐
- Android开发之多线程编程Thread和Runnable使用
- Android开发之多线程编程Thread和Runnable使用
- Android开发之多线程编程Thread和Runnable使用
- Android开发之多线程编程Thread和Runnable使用
- Android开发之多线程编程Thread和Runnable使用
- Android开发之多线程编程Thread和Runnable使用
- Android开发之多线程编程Thread和Runnable使用
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
- 实现多线程有两种方法: Thread类继承和Runnable接口实现
- java实现多线程有两种方法:1、集成Thread类、2、实现Runnable接口
- Java 多线程:extends Thread Class & implements Runnable Interface
- java多线程(二)-Runnable和Thread
- JAVA基础(多线程Thread和Runnable的使用区别
- JAVA多线程实现的三种方式(继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程)
- 嵌入式Linux应用程序开发——多线程3(线程的同步——条件变量)
- 多线程-----Thread类与Runnable接口的区别
- Java多线程中Runnable和Thread的区别
- 多线程相关 Thread、Runnable、Callable、Futrue类关系与区别
- Java多线程系列--“基础篇”02之Runnable和Thread
- Java中 Thread和Runnable实现多线程的区别和联系