java多线程概念总结

来源:互联网 发布:50部网络禁书目录 编辑:程序博客网 时间:2024/05/20 06:31

cpu执行资格:可以被cpu处理,在处理队列中排队

cpu执行权:正在被cpu处理



运行:具备着cpu执行资格和执行权

冻结:释放cpu执行资格权的同时释放cpu执行资格

临时阻塞状态:具备着cpu执行资格,但是不具备cpu执行权,正在等待着执行权


创建线程的第一种方式:继承Thread类,复写run方法

创建线程的第二种方式:实现Runnable接口,覆盖run方法,通过Thread类创建线程对象,并将Runnbale接口的子类对象作为构造方法的参数进行传递

通过start方法开启线程


实现Runnable接口的好处:

1)将线程的任务从线程的子类中分离出来,进行了单独封装,按照面向对象的思想将任务封装成对象

2)避免了java单继承的局限性

所以通过该方法创建线程更为常用


线程安全问题的原因:

1)多个线程在操作共享的数据

2)操作共享数据的线程代码有多条

当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导致线程安全问题


同步:

同步好处:解决了线程的安全问题

同步弊端:相对降低了效率,因为同步外的线程都会判断同步锁

同步的前提:必须由多个线程并使用同一个锁


同步函数和同步代码块的区别:

同步函数的锁死固定的this

同步代码块的锁是任意的对象

静态同步函数使用的锁是该函数所属的字节码文件对象,可以用getClass获取,也可以用.Class获取


wait()和sleep()的区别:

wait():释放cpu执行权,释放锁;可以指定时间,也可以不指定

sleep():释放cpu执行权,不释放锁;必须指定时间


问题1:wait(),notify(),notifyAll()这些方法时操作线程的,为什么定义在了Object类中

1)这些方法存在于同步中

2)使用这些方法时必须要标识同步锁

3)同步锁可以使任意对象,而任意对象一定是Object的子类


问题2:为什么操作线程的方法,定义在了Object类中

因为这些方法时监视器方法,监视器其实就是锁;锁可以是任意对象,任意对象调用的方法一定定义在Object类中


jdk1.5以后的新特性:

1)将同步锁封装成了对象,并将操作锁的隐式方法定义在了该对象中,将隐式动作变成了显式动作

Lock lock=new ReentrantLock();lock.lock();lock,unLock();

2)出现了替代Object类中的wait和notify的方法,将这些监视器方法单独封装成condition对象,可以与任意锁组合

lock.newCondition();

3)守护线程:后台线程,如果前台线程生命已经结束,后台线程强制自行结束(无论是否处于冻结状态)

Thread t1=new Thread(); t1.setDaemon(true);将t1线程设为后台线程

4)联合线程:线程要申请加入进来运行,join也可以让线程处于冻结状态

     临时加入一个线程运算时可以使用join方法。哪个线程执行到了join方法,哪个线程就释放cpu执行资格和执行权,      等调用join方法的线程执行完后再执行。

线程具有优先级,优先级越高,获得cpu执行权的机会就越大

优先级范围1-10;

MAX PRIORITY:高优先级 10

MIN PRIORITY:低优先级   0

NORM PRIORITY:默认优先级 5

可以通过setPriority方法设置优先级


interrupted 方法可以将线程从冻结状态恢复过来

yield方法,暂停,(暂时释放cpu,然后所有线程强cpu执行权),静态方法


转载自:多线程内容整理

0 0