Java线程总结

什么是进程,什么是线程?多线程

简而言之,进程能够当作正在运行的程序的实例。而线程能够当作进程里面的一条执行路径。并发

每一个进程都有独立代码和数据空间(进程上下文),同一个进程中能够共享程序的内存和数据。因此线程之间切换代价小,进程之间切换代价大。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()方法分别用来设置和获取线程的优先级。

通常状况下不须要手动设置线程的优先级,而是用默认的优先级就好。

相关文章
相关标签/搜索