线程基础方法 实现线程的4种方式 1.继承thread类,是runnable接口的实现。 2.实现runnable接口,重写run()方法,比继承thread类好用,实现接口还可以继承类,避免单继承带来的局限性。 3.使用excutor框架创建线程池,是juc提供的线程池的实现。 4.实现callabie接口,重写call方法,有返回值。 一般情况下使用第二种,避免继承的局限性,一个类可以继承多个接口,适合于资源的共享 继承thread类的线程类,可以直接调用strat方法启动线程,使用static可以实现资源共享,一个线程只能执行一次start方法,而且不能通过实现类对象的run方法去启动一个类,run是一个普通方法, 1 2 3 4 5 6 thread的常用方法 1.start:启动线程并执行相应的run方法 2.run:子线程要执行的代码放入run方法里面 3.currentthread:静态的,调取当前线程的 4.getname:获取当前线程的名字 5.setname:设置当前线程的名字 6.yield:调用此方法的线程将释放当前cpu的执行权,(很可能自己再次抢到资源) 7.join:在a线程调用b线程的join方法,表示当执行到此方法,a线程停止运行,直到b线程运行完成, 8.isalive:判断线程是否还存活 9.sleep:显性的让当前线程睡眠n毫秒,只能捕获异常,因为run方法没有抛出异常, 10.wait:当一个线程调用object.wait,那么这个线程就会进入object对象的等待队列,在这个队列中可能会有多个线程,因为系统运行多个线程同时等待某一个对象,调用wait会释放锁,sleep不会 11.notify:当一个线程调用object.notity,就会从这个等待队列随机唤醒一个线程, 12.notifyall:唤醒当前等待队列的所有线程 设置线程的优先级,非绝对,只是相对几率会大些, getpriority:返回线程的优先级 setpriority:改变线程的优先级 通过调用start方法来启动一个线程,这个时候该线程是就绪可运行状态,并没有运行,要等该线程拿到cpu时间片,就会开始执行run方法,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 线程执行流程 创建线程--》start--》可运行、就绪状态--》拿到cpu时间片--》运行状态--》stop或者run结束--》销毁状态
创建线程--》start--》可运行、就绪状态--》拿到cpu时间片--》运行状态--》sleep、join--》其他阻塞--》sleep、join完成--》就绪
创建线程--》start--》可运行、就绪状态--》拿到cpu时间片--》运行状态--》wait--》等待阻塞状态---》notify、notifyall--》锁定阻塞状态--》同步锁释放--》就绪
创建线程--》start--》可运行、就绪状态--》拿到cpu时间片--》运行状态--》synchronize--》锁定阻塞--》同步释放锁--》就绪
创建线程--》start--》可运行、就绪状态--》拿到cpu时间片--》运行状态--》时间片用完、yield方法--》就绪