您的位置:首页 > 其它

应用程序开发——多线程(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()来控制线程
------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息