简介
- 进程与线程
线程实现(重点)
-
创建线程方式一
继承Thread类,重写run方法,调用start()开启线程
public class createthread extends Thread{ //线程入口点 public void run(){ //线程体 for (int i = 0; i < 20; i++) { System.out.println("run"+i); } } public static void main(String[] args) { //创建线程对象 createthread c1=new createthread(); c1.start(); for (int i = 0; i < 20; i++) { System.out.println("main"+i); } } }
注意:线程开启{通过satart()方法开启}不一定立即执行run,而是由cpu调度执行-----不推荐:为了避免oop单继承的局限性
主线程:线程对象创建和开启线程
- 实现Runnable方法->重写run方法->参数为实现类的线程调用satrat()-----推荐使用,避免单继承的局限性,方便同一个对象被多个线程使用
public class jion implements Runnable{
public void run(){
for (int i = 0; i < 5; i++) {
System.out.println(“vip”);
}
}
public static void main(String[] args) throws InterruptedException {
jion s1=new jion();
Thread s2=new Thread(s1);
Thread s3=new Thread(s1);
s2.start();
s3.start();
for (int i = 0; i < 10; i++) {
System.out.println("main");
}
}
}
线程状态
注意:一旦进入死亡状态就不能再次启动
sleep
- 每个对象都有一个锁,sleep不会释放锁
- 模拟网络延时能够放大问题的发生性
礼让
- 礼让不一定成功,看cpu心情,礼让完了之后进程之间为竞争关系
观察线程状态
-
线程状态。线程可以处于以下状态之一:
NEW
尚未启动的线程处于此状态。RUNNABLE
在Java虚拟机中执行的线程处于此状态。BLOCKED
被阻塞等待监视器锁定的线程处于此状态。WAITING
正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。TERMINATED
已退出的线程处于此状态。
一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。
-
线程优先级
- 优先级的设定在start()调度前
- 获取优先级getpriority(),设置优先级setpriority(int x)
- 优先级低只是意味着获得调度的概率低,都是看cpu调度,这可能会产生性能导置的问题
- java提供一个线程调度器来监考程序中启动后进入就绪状态的所有线程,线程调度器参考优先级决定应该调度哪个程序来执行。
守护(daemon )线程
- 线程分用户线程和守护线程
- gvm必须保证用户线程执行完毕,无需等待守护线程执行完毕
- 守护线程用于记录操作日志,监控内存,垃圾回收等等
线程同步(重点)
-
并发:同一个对象被多个线程同时操作
-
由于同一个进程的多个线程共享一块访问空间,带来了访问法冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronzied
- 其他线程将锁挂起
- 多线程竞争下,加锁,释放锁会导致较多的上下文切换和调度延时,引起性能问题
- 优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题
同步方法
- 由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提供一套机制,这就是synchronized,
- 包括sychronized方法:public synchronized void method(){}
- sychronized方法块:sychronized(obj){对obj 的一些操作},obj为需要增删改查的任意对象
- 每个对象都对应一把锁,每个sychronized方法都必须获得该方法的对象锁才能执行,否则线程会阻塞,直到锁被释放,才能获得锁,进而执行
- 一般需要修改的部分才加锁
- 同步方法默认锁的是this
- 同步块可以锁任何对象
- juc安全类型集合
LOCK锁
线程通信问题
1 wait(),notify(),notifyAll()
线程通信问题
1 wait(),notify(),notifyAll()