什么是进程,什么是线程?多线程
简而言之,进程能够当作正在运行的程序的实例。而线程能够当作进程里面的一条执行路径。并发
每一个进程都有独立代码和数据空间(进程上下文),同一个进程中能够共享程序的内存和数据。因此线程之间切换代价小,进程之间切换代价大。jvm
多进程: 在操做系统中能同时运行多个任务(程序);ide
多线程: 在同一进程有多个并发任务在执行测试
线程的建立有两种方式。spa
方式一:实现Rannable接口,重写run方法。这种方法,还须要使用Thread类,来对Runnable子类的实例进行封装,调用Thead类中的start方法才能启动。操作系统
方式二:继承Thread类,重写run方法,调用start()使该线程处于"可执行/可运行"状态,等待虚拟机来调度线程
启动线程时,建立的实例不能直接调用,重写的run方法,不然不是启动多线程。而是调用start方法。对象
run方法称为线程体方法,线程被CPU调度时,自动执行,同一个线程对象只能调用一次start方法。不管线程是否结束,Runnable接口能够为一个线程的多个实例共享数据。继承
方法:
long getId():返回该线程的标识符。
String getName():返回该线程的名称。
void interrupt():中断线程。
boolean isAlive():测试线程是否处于活动状态。
boolean isDaemon():测试该线程是否为守护线程。
booleanisInterrupted():测试线程是否已经中断。
void setDaemon(booleanon):将该线程标记为守护线程或用户线程。
voidsetName(String name):改变线程名称,使之与参数 name 相同。
static voidsleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操做受到系统计时器和调度程序精度和准确性的影响。
void start():使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
static voidyield():暂停当前正在执行的线程对象,并执行其余线程。
如下的三个方法定义在Object类中,而不是Thread类中。
final void notifyAll():将全部的线程唤醒,进入就绪状态。
final void notify():唤醒一个线程,使其进入就绪状态。
final void wait():使线程等待,阻塞状态。
中断线程的两种方法:
方法一:在线程类中设置一个标志位,经过在其余线程(例如主线程)中修改该标志位的值,来达到中止线程的目的.通常在子线程的run()的循环中须要加上退出条件if(flag){....break;}
方法二:线程对象调用interrupt()方法。
(1)要被中断的线程阻塞在sleep()/wait()/join()上,会引起一个 InterruptedException,须要在catch语句中进行处理;
(2)不是上述状况下,能够用Thread.interrupted()来获取是否中断的状态,若是是被中断了,则break出来,再也不执行后续语句;注意:该方法调用后,会清除"中断标志",下次再调用时,将获得false
线程的调度:
线程睡眠:Thread.sleep(longmillis) throws InterruptedException 方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。
线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
线程加入:join() throwsInterruptedException 方法 在当前线程中调用另外一个线程的 join()方法,则当前线程转入WAITING状态,直到另外一个线程运行结束,当前线程再由阻塞转为就绪状态。
线程等待:Object 类中的wait() throws InterruptedException 方法,致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。
线程唤醒:Object 类中的notify()方法,唤醒在此对象监视器上等待的单个线程。若是全部线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的。Object类中的notifyAll()方法,唤醒在此对象监视器上等待的全部线程。
线程的状态转换:线程共有建立状态,就绪状态,运行状态,阻塞状态,死亡状态。
建立状态,在产生线程的对象,尚未调用start方法以前的状态。调用start方法后,就进入了就绪状态,等待jvm的调度。一旦jvm调度了线程,就使线程进入了运行状态。若是运行着的线程,被暂停,就进入了阻塞状态。若是线程的run方法执行结束或者线程调用了stop方法,则线程就会死亡。
线程的优先级。最高级为10,最小为1,默认为5。线程的优先级设置,并不必定优先级高的就必定先执行,而是先执行的几率大。因此优先级高的,线程先执行这句话是错的。
使用setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
通常状况下不须要手动设置线程的优先级,而是用默认的优先级就好。