(JAVA)-多线程的生命周期和成员方法
?
?线程的生命周期
1.新建状态:创建线程对象
2.就绪状态:调用start()方法后,有执行资格没有执行权(抢夺cpu执行权)
3.运行状态:抢到了cpu执行权,运行代码,当cpu执行权被抢走,又回到就绪状态
4.死亡状态:当run方法的内容全部执行完,线程就会死亡,变成垃圾
5.阻塞状态:当遇到sleep或者其他阻塞方法,线程就会等着,没有执行资格也没有执行权
,当sleep的时间到了或者其他阻塞方式结束,又会回到就绪状态。
细节:
1.没给线程设置名字线程也有默认的名字格式Thread-x(x为序号,从0开始)
2.jvm虚拟机启动后会启动多条线程,其中有一条线程就是main线程,作用是调用main方法,并执行里面的代码
3.sleep方法:哪个线程执行到这个方法就会停留对应的时间
?线程的调度
1.抢占式调度:多个线程抢占cpu的执行权,具有随机性
2.非抢占式调度:线程轮流执行
jvm中线程的调度是抢占式调度,优先级越高,抢到cpu的概率越大,Java中的线程分为10档,最低是1,不设置默认是5.
?守护线程
fianal void setDaeom(boolean on)
细节:当非守护线程结束了,守护线程也会陆续结束
public static void main(String[] args) { //1.自己定义一个类继承Thread MyThread t=new MyThread(); MyThread1 t1=new MyThread1(); t.setName("线程1"); t1.setName("线程2"); t.setDaemon(true);//将线程1设置为守护线程 t.start(); t1.start(); } //线程1 class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName()+"hello"); } } //线程2 class MyThread1 extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(getName()+"hello"); } } }
细节:
1.我们可以看到,当非守护线程结束后,守护线程没有立马结束,会运行一小段时间,因为在线程退出的一瞬间,守护线程会抢到一小会cpu执行权
2.thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出一个IllegalThreadStateException异常。
3.正在运行的常规线程不能设置为守护线程。
4.多个线程同时运行,守护线程会等所有线程都运行完停止。
礼让线程
public static void yield()
表示出让当前CPU执行权,从运行状态进入就绪状态
此方法跟sleep方法有点像
关于sleep()方法和yield()方的区别如下:
1.sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态;而yield方法调用后 ,是直接进入就绪状态,完全可能马上又被调度到运行状态。
2.sleep 方法会给其他线程运行的机会,但是不考虑其他线程优先级的问题;而yield 方法会优先给更高优先级的线程运行机会。
3.sleep方法声明抛出了InterruptedException,所以调用sleep方法的时候要捕获该异常,或者显示声明抛出该异常。而yield方法则没有声明抛出任务异常。
public class MyThread1 extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(i+getName()+"hello"); Thread.yield(); } } }
能尽量让执行结果均匀一点
插入线程
public final void join();
t.join(); for (int i = 0; i < 100; i++) { System.out.println(i+"主线程结束"); }
表示把t线程插入在当前线程之前完成。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!