线程的创建方式
继承Thread
class MyThread extends Thread {
@Override
public void run() {
}
}
MyThread t = new MyThread();
t.start()
实现Runnable接口 推荐
class MyRunnable implements Runnable {
@Override
public void run() {
}
}
MyRunnable my = new MyRunnable();
Thread t = new Thread(my);
t.start()
匿名内部类方式操作
new Thread(new Runnable() {
@Override
public void run() {
}
});
操作系统层面 5种状态
新建 就绪 运行 终止 阻塞
Java里面 6种状态
新建状态: new 创建线程对象
可运行状态:start()方法,进入可运行状态,线程可能开始运行,也可能没有运行
刚start() ,线程相当于先进入就绪状态,获取cpu资源,进入运行状态
cpu时间片到期,yield() 线程回到就绪状态
阻塞状态:通过同步方法、同步代码块对象程序加锁,其他线程访问已加锁的代码时,进入阻塞状态
当线程释放锁,阻塞的线程进入可运行状态,哪个线程抢到cpu资源,该线程执行相关程序,并继续加锁
等待状态:线程中调用wait()/join()等方法,线程进入等待状态
其他线程通过notify()唤醒等待的线程,或者join的线程执行完毕,线程线程进入可运行状态
计时等待状态:sleep(long)/wait(long)/join(long) 进入计时等待状态
终止状态:run方法正常执行完毕,或者报异常
sleep() 哪个线程调用sleep方法,哪个线程就休眠
join() 线程插队 ,插队的线程先执行完,其他的线程才会继续执行
yield()线程礼让 哪个线程中调用yield方法,哪个线程进入就绪状态
线程同步
针对线程安全:多个线程访问共享的数据
同步机制
同步方法 synchronized 修饰方法
同步代码块
synchronized(锁对象) {
需要同步执行的代码
}
锁对象必须唯一,相当于多个线程共享一把锁
单例设计模式
整个程序中,如果某个类的对象只需要一个,这个时候就可以使用单例模式
懒汉式
饿汉式 推荐
注意:构造方法需要设置为private