许多程序都包含一些独立的代码段,如果让这些代码段的执行时间彼此重叠,就可以获得更高的执行效率。线程就是为了实现这种重叠执行而引入的一个概念。线程是独立,并发执行的线程单元。多线程指程序中同时存在多个执行体,它们按照自己的执行路线并发工作,独立完成各自的功能,互不干扰。
多线程机制是JAVA语言中的一个重要特征,使用多线程技术可以使系统同时运行多个执行体,这样加快程序的响应时间,提高计算机资源的利用率。使用多线程技术可以提高整个应用系统的性能。
1、线程是用Thread类及其子类对象来表示。
线程定义:定义一个类extends Thread
重写线程的run方法,将并发任务写在run方法中
创建线程对象
启动线程,调用线程的start方法
2、 线程的集中创建方法
[b] 继承Thread [/b] 重写run方法,创建对象,调用start方法
[b]实现Runnable接口[/b] 重写run方法,创建对象,将对象包装成线程对象,调用start方法
[b] 继承定时器任务类Timetable[/b] 重写run方法,创建任务对象,创建定时器对象,定时器启动任务
用继承Thread类的子类或通过实现Runnable接口来创建线程无本质的区别,但是由于Java语言不允许多重继承,所以如果一个类必须继承另一个非Thread类,此时要实现多线程只能通过实现Runnable接口的方式。
3、线程的状态[生命周期]
[b][color=red] New Thread 新建状态 [/color][/b] 用new关键字和Thread类或其子类建立一个线程对象,该线程就处于新建状态。处于其状态的线程是有自己的内存空间的,通过start方法进入就绪状态。
[b][color=red] Runnable 就绪状态 [/color][/b] 处于其状态下的线程就已具备运行条件,但还没分配到CPU,因而将进入线程队列,等待系统为其分配CPU。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
[b][color=red] Running 运行状态[/color][/b] 在运行状态的程序执行自己的run方法中代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。
[b][color=red]Not Runnable 挂起状态 [/color][/b] 处于运行状态的线程在某些情况下,如执行sleep方法,或等待I/O设备等资源,将让出CPU并暂停时终止自己的运行,进入阻塞状态。在阻塞状态下的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待CPU资源。当再次获得CPU时,便从原来终止位置开始继续运行。
[b][color=red] Dead 死亡状态[/color][/b] 它是线程生命的最后一个阶段,线程死亡的原因有两个:一个是正常运行的线程完成了它的全部工作;另一个线程被强制性的终止,如通过执行stop或destroy方法来终止一个线程。
4、 线程的一些重要方法
5、 线程的优先级
每个线程都具有各自的优先级,线程的优先级可以在程序中表明该线程额重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定使哪个线程进入运行状态。但是这并不意味着低优先级的线程得不到运行,而只是它的运行的几率比较小,就好像回收垃圾线程的优先级就比较低。
线程的优先级可以使用setPriority()方法调整,优先级从1到10 设置优先级的大小,1表示优先级最低,5表示默认优先级,10表示优先级最高,数字越大,优先级越高;如果不在1到10之间,就会产生一个IllegalArgumentException异常。
6、 线程守护
例:
其他普通线程全部执行完毕了,守护线程不管是否执行完毕,都会结束
7、 线程的同步
在单线程程序中,每次只能做一件事,后面的事情需等待前面的线程完成后才可以进行。但是使用多线程,就会发生两个线程抢占资源的问题,一个账户,两张银行卡,其两张卡同时取钱。所以在多线程编程中,需要防止这些资源访问的冲突。Java提供线程同步的机制来防止资源访问的冲突。
a) 线程默认是异步的
多个线程可以同时操作同一个数据[同一块内存]
b) 线程的同步
多个线程不能同时操作同一个数据
c) 如何实现线程的同步??
同步锁
synchronized
方式一:使用synchronized(对象) 锁住需要同步的代码块
synchronized(对象){
}
方式二:使用synchronized锁住需要同步的方法
public synchronized void method(){
}
方式三:从jdk1.5开始提供的对象锁
Lock l = new ReentrantLock();
//上锁
l.lock();
//解锁
L.unlock();
方式四:使用wait-notify机制
多线程机制是JAVA语言中的一个重要特征,使用多线程技术可以使系统同时运行多个执行体,这样加快程序的响应时间,提高计算机资源的利用率。使用多线程技术可以提高整个应用系统的性能。
1、线程是用Thread类及其子类对象来表示。
线程定义:定义一个类extends Thread
重写线程的run方法,将并发任务写在run方法中
创建线程对象
启动线程,调用线程的start方法
2、 线程的集中创建方法
[b] 继承Thread [/b] 重写run方法,创建对象,调用start方法
[b]实现Runnable接口[/b] 重写run方法,创建对象,将对象包装成线程对象,调用start方法
[b] 继承定时器任务类Timetable[/b] 重写run方法,创建任务对象,创建定时器对象,定时器启动任务
用继承Thread类的子类或通过实现Runnable接口来创建线程无本质的区别,但是由于Java语言不允许多重继承,所以如果一个类必须继承另一个非Thread类,此时要实现多线程只能通过实现Runnable接口的方式。
3、线程的状态[生命周期]
[b][color=red] New Thread 新建状态 [/color][/b] 用new关键字和Thread类或其子类建立一个线程对象,该线程就处于新建状态。处于其状态的线程是有自己的内存空间的,通过start方法进入就绪状态。
[b][color=red] Runnable 就绪状态 [/color][/b] 处于其状态下的线程就已具备运行条件,但还没分配到CPU,因而将进入线程队列,等待系统为其分配CPU。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
[b][color=red] Running 运行状态[/color][/b] 在运行状态的程序执行自己的run方法中代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。
[b][color=red]Not Runnable 挂起状态 [/color][/b] 处于运行状态的线程在某些情况下,如执行sleep方法,或等待I/O设备等资源,将让出CPU并暂停时终止自己的运行,进入阻塞状态。在阻塞状态下的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待CPU资源。当再次获得CPU时,便从原来终止位置开始继续运行。
[b][color=red] Dead 死亡状态[/color][/b] 它是线程生命的最后一个阶段,线程死亡的原因有两个:一个是正常运行的线程完成了它的全部工作;另一个线程被强制性的终止,如通过执行stop或destroy方法来终止一个线程。
4、 线程的一些重要方法
Thread.currentThread() 获得当前线程对象
Thread.sleep(毫秒) 当前线程休眠指定的毫秒数
setPriority(Thread.MAX_PRIORUTY); 设置线程的优先级
getPriority(); 获得线程的优先级
join() 等待该线程执行完毕
yield() 暂停当前正在执行的线程对象,并执行其他线程
getState() 获得线程的状态
isAlive() 是不是活动的线程
start() 启动线程的方法
5、 线程的优先级
每个线程都具有各自的优先级,线程的优先级可以在程序中表明该线程额重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定使哪个线程进入运行状态。但是这并不意味着低优先级的线程得不到运行,而只是它的运行的几率比较小,就好像回收垃圾线程的优先级就比较低。
线程的优先级可以使用setPriority()方法调整,优先级从1到10 设置优先级的大小,1表示优先级最低,5表示默认优先级,10表示优先级最高,数字越大,优先级越高;如果不在1到10之间,就会产生一个IllegalArgumentException异常。
6、 线程守护
例:
MyThread2 t2 = new MyThread2();
//设置t2为守护线程
t2.setDaemon(true);
t2.start();
其他普通线程全部执行完毕了,守护线程不管是否执行完毕,都会结束
7、 线程的同步
在单线程程序中,每次只能做一件事,后面的事情需等待前面的线程完成后才可以进行。但是使用多线程,就会发生两个线程抢占资源的问题,一个账户,两张银行卡,其两张卡同时取钱。所以在多线程编程中,需要防止这些资源访问的冲突。Java提供线程同步的机制来防止资源访问的冲突。
a) 线程默认是异步的
多个线程可以同时操作同一个数据[同一块内存]
b) 线程的同步
多个线程不能同时操作同一个数据
c) 如何实现线程的同步??
同步锁
synchronized
方式一:使用synchronized(对象) 锁住需要同步的代码块
synchronized(对象){
}
方式二:使用synchronized锁住需要同步的方法
public synchronized void method(){
}
方式三:从jdk1.5开始提供的对象锁
Lock l = new ReentrantLock();
//上锁
l.lock();
//解锁
L.unlock();
方式四:使用wait-notify机制