进程:正在运行的程序
多线程处于宏观上的并行/微观上的串行状态
第一种实现多线程的方法:
新增类继承Thread
重写run方法
在测试类中创建子对象调用start()方法启动该子线程
第二种实现多线程的方法:
新增类实现runnable
重写run方法
在测试类中创建子对象
创建线程对象,子对象作为线程对象的参数,调用start()方法启动该子线程
实际使用过程中也有其他的方法
java虚拟机启动都会自己创建一个主线程
不同的线程交替执行,在各个计算机中是不一样的,甚至在同一台计算机中不同时间也是不一样的, 但是交替执行是必须的
开启一个子线程的方法是start(),如果直接调用run方法,那么这个run方法会被当成一个普通的方法,不会交替执行
线程的优先级:
优先级的值只能是1-10的int值,超出范围会报异常( 非法参数异常)
使用方法:线程对象.setPriority(Thread.MAX_PRIORITY)
线程合并,
当前线程释放cpu资源,线程暂停
主线程需要等合并的线程全部执行完毕后才能再次执行,
join之前,线程一定要处于就绪状态
守护线程的特点是:
所有的前台的线程都结束了,后台的线程不论有没有执行完毕都会消亡
后台线程可以比前台线程先执行结束
设置线程为守护线程:thread.setDaemon(true)
线程休眠:thread.sleep(时间:毫秒)
线程让步:
可以将当前正在执行的线程暂停,但不会阻塞该线程,只是将线程变成就绪状态
特点:某个线程调用了yield方法之后,只有优先级一致或者高于其优先级的处于就绪状态的线程才能有执行的机会
某个线程执行yield方法让出cpu资源后,不一定就是执行其他的线程,也有可能继续执行当前线程
线程的生命周期\
new新建状态 Thread t = new Thread();
runnable就绪状态,没有获取到cpu资源,处于可运行状态,并没有真正的运行
running运行状态 就绪状态的线程抢到了cpu的资源开始运行就是运行状态
block阻塞状态 ,执行一些阻塞方法编程了阻塞状态,线程不运行
dead:死亡状态
程序运行完毕正常结束
调用stop方法强制提前结束
sleep与wait对比
共同点:都会抛出InterruptedException异常
sleep
指定休息时间,自动处于可运行状态
不释放锁
Thread类的静态方法,只能通过Thread类或者对象来调用
Thread类中有两个重载的方法
wait
等待,需要被唤醒
会释放锁
Object类的方法,哪里都可以使用
Object类中有3个重载方法