我们的操作系统:
将时间分成很小很小的时间段,某一时刻只能有一个程序在跑,这是单核的CPU。CPU是来执行二进制指令的,可以用汇编来表示。
单核的话,某一时刻只能有一个程序,一个进程在运行,因为时间比较快,给人宏观上的感觉好像是程序在并行。
多核的话,比如8核,在某一时刻最多能有8个进程,或者8个线程在运行。
多线程的5种状态:
1)new 新建状态
2)runnable 可运行状态
3)running 运行时状态
4)block 阻塞状态
5)dead 死亡状态
如果出现阻塞状态(block)等待时间过去之后又会回到runnable
创建线程的两种状态
1)继承Thread类和实现Runnable接口
2)可以用匿名内部类的方式
new Thread(){
public void run(){
Sysotem.out.println("bbb");
}
}.start();
new Thread(new Runnable(){
public void run(){
Sysotem.out.println("bbb");
}
}).start();
多线程并发
用synchronized来解决多线程并发问题
例如 User user = new User();
synchronized只能写在方法和代码块上作用于对象只能说锁住对象
如果方法是一个今天方法的话 那么枷锁的这个对象就会是 Class clazz = User.class;或者这样写Class clazz = user.getClass();
代码块这样写
synchronized (User.class){
}
synchronized修饰的代码块叫做同步代码块
synchronized和lock的区别
一般在线程比较少的情况下用synchronized因为它比较简单,不用new一个lock,直接写在方法上或者代码块上就可以。
而lock一般用在线程比较多的地方,lock有trylock,尝试获取锁,如果没有获取到锁可以做别的事情。
synchronized只能把锁加载对象上并且能自动释放锁,lock自己本身就是一个锁,每次都需要new一个lock,每次都需要手动释放锁,如果不释放锁就会变成死锁。
synchronized可以修饰一个方法一个代码块,通过一个方法获得对象锁,通过静态方法或得的锁。代码块也一样。
睡眠模式类
Thread.sleep(毫秒);不用new对象也可以直接使用。
线程有优先级的
一共有一到十级,默认是五级,对少是1级。10比1优先级要高,优先级越高,越先执行。
setPriority(1-10);来设置优先级。
有一种线程叫守护线程,也叫后台线程,也叫精灵线程。
setDaemon(true-false)true的话指的是当其他线程执行完成之后它将结束线程或者杀死线程,终止线程。false的话则不会。
interrupt();叫醒睡眠(sleep())的线程
lock
方法:lock()void, 获取锁
lockInterruptibly()void,
tryLock()boolean,尝试获取锁 如果没有获取锁可以做一些别的事情
tryLock(long,TimeUnit)Boolean,尝试获取锁,可以定义时间在规定时间没持续获取锁
unlock()void,释放锁
因为lock是一个借口没有办法new对象所以要这样创建
Lock lock = new ReenterantLock();
ReenterantLock是Java对lock的一个实现。
wait与sleep的区别
wait()方法是属于Object的方法
sleep()方法是Thread的方法
wait只能出现在synchronized的代码块中
这两个方法都是让程序等待一段时间然而 sleep方法在等待的过程中不能释放锁,wait可以在等待的过程中自己释放锁。
notify和notifyall方法都是Object的方法
notify是唤醒某一个线程可能和优先级有关也可能是随机的
notifyall是表示唤醒所有的线程。
将时间分成很小很小的时间段,某一时刻只能有一个程序在跑,这是单核的CPU。CPU是来执行二进制指令的,可以用汇编来表示。
单核的话,某一时刻只能有一个程序,一个进程在运行,因为时间比较快,给人宏观上的感觉好像是程序在并行。
多核的话,比如8核,在某一时刻最多能有8个进程,或者8个线程在运行。
多线程的5种状态:
1)new 新建状态
2)runnable 可运行状态
3)running 运行时状态
4)block 阻塞状态
5)dead 死亡状态
如果出现阻塞状态(block)等待时间过去之后又会回到runnable
创建线程的两种状态
1)继承Thread类和实现Runnable接口
2)可以用匿名内部类的方式
new Thread(){
public void run(){
Sysotem.out.println("bbb");
}
}.start();
new Thread(new Runnable(){
public void run(){
Sysotem.out.println("bbb");
}
}).start();
多线程并发
用synchronized来解决多线程并发问题
例如 User user = new User();
synchronized只能写在方法和代码块上作用于对象只能说锁住对象
如果方法是一个今天方法的话 那么枷锁的这个对象就会是 Class clazz = User.class;或者这样写Class clazz = user.getClass();
代码块这样写
synchronized (User.class){
}
synchronized修饰的代码块叫做同步代码块
synchronized和lock的区别
一般在线程比较少的情况下用synchronized因为它比较简单,不用new一个lock,直接写在方法上或者代码块上就可以。
而lock一般用在线程比较多的地方,lock有trylock,尝试获取锁,如果没有获取到锁可以做别的事情。
synchronized只能把锁加载对象上并且能自动释放锁,lock自己本身就是一个锁,每次都需要new一个lock,每次都需要手动释放锁,如果不释放锁就会变成死锁。
synchronized可以修饰一个方法一个代码块,通过一个方法获得对象锁,通过静态方法或得的锁。代码块也一样。
睡眠模式类
Thread.sleep(毫秒);不用new对象也可以直接使用。
线程有优先级的
一共有一到十级,默认是五级,对少是1级。10比1优先级要高,优先级越高,越先执行。
setPriority(1-10);来设置优先级。
有一种线程叫守护线程,也叫后台线程,也叫精灵线程。
setDaemon(true-false)true的话指的是当其他线程执行完成之后它将结束线程或者杀死线程,终止线程。false的话则不会。
interrupt();叫醒睡眠(sleep())的线程
lock
方法:lock()void, 获取锁
lockInterruptibly()void,
tryLock()boolean,尝试获取锁 如果没有获取锁可以做一些别的事情
tryLock(long,TimeUnit)Boolean,尝试获取锁,可以定义时间在规定时间没持续获取锁
unlock()void,释放锁
因为lock是一个借口没有办法new对象所以要这样创建
Lock lock = new ReenterantLock();
ReenterantLock是Java对lock的一个实现。
wait与sleep的区别
wait()方法是属于Object的方法
sleep()方法是Thread的方法
wait只能出现在synchronized的代码块中
这两个方法都是让程序等待一段时间然而 sleep方法在等待的过程中不能释放锁,wait可以在等待的过程中自己释放锁。
notify和notifyall方法都是Object的方法
notify是唤醒某一个线程可能和优先级有关也可能是随机的
notifyall是表示唤醒所有的线程。