多线程
1.理解线程的概念
进程:一个程序的运行实例,正在进行的程序。通常一个程序对应一个进程。它有独立的内存空间和系统资源。
线程:是CPU中运算和分派的基本单位,也是进程中运算的基本单位,一个进程中可以有多个线程,一个线程可以独立完成一个顺序控制流程。
多线程和单线程概念
单线程:如果一个程序中只有一个线程,则称为单线程。
多线程:多个线程。
多线程和单线程的区别:
1.多线程在执行时并不一定有单线程执行快。
2.多线程生产的根本原因也是它的最根本的优势在于我们能够在一个程序中,同时干多件事,可以充分利用CPU资源。
3.其实多线程有两个概念:一种是指单核CPU的多线程。一种是指多核CPU的多线程。
单核CPU:同时只能执行一个线程 但是同样可以实现多线程,这个多线程是“抢占式/交替”执行的。
多核CPU:可以进行交替执行,也可以实现真正的物理上的并行执行。
主线程
一个进程有且仅有一个主线程,主线程是负责程序的开启和程序最后关闭动作的线程。
java.lang.Thread类
//获取当前线程 the currently
executing thread .
Thread currentThread =
Thread.currentThread();
//查看线程的名称
System.out.println(currentThread.getName());
//设置线程的名称
currentThread.setName(“小红”);
System.out.println(currentThread.getName());
2.掌握线程的基本创建和启动
线程的第一种创建方式
1.继承Thread类
2.重写run()方法
3.调用start()启动线程
线程的第二种创建方式
1.实现Runnable接口
2.重写run()方法
3.创建线程对象 组装Runnable接口的实现类,调用start()方法启动线程。
start()和 run()的区别
如果是调用run()方法 它只是一个普通方法,届时将只有主线程在执行此方法而已。(和以前的其他方法调用效果无区别。
如果是调用该start()方法,它会新开启一个线程,然后此线程会和其他线程交替执行某些任务,此线程执行的内容就是run()方法内的任务。
3.了解线程的几种状态
创建状态:当new Thread()时,线程 处于创建状态。
就绪状态:当调用start()之后,线程处于就绪状态。
运行状态:当线程被分配到了CPU资源,线程处于运行状态。如果线程运行状态
如果线程运行状态时,是处于抢占式执行的,当没抢到时又到就绪状态。
死亡状态:当线程执行完任务,或者被外部干涉结束,线程会进入死亡状态。
阻塞状态:当用户在输入/线程在休眠时,线程就会进入阻塞状态,当阻塞状态结束后会进入就绪状态。
4.掌握线程调度的常用方法
线程优先级
线程休眠
线程礼让
线程强制执行
线程中断,,,,
5.掌握线程的同步问题(线程安全)
同时有多个线程在执行任务,虽 然它们是交替执行,但是速度切换很快,如果有一 些资源被共享,可能导致资源出错。
线程并发
同一个资源被多个线程共享,可以通过“加锁”来解决问题。
同步synchronized
同步方法
public synchronized void saleTicket(){
}
同步代码块
synchronized(this){
}
6.常见的线程安全类型
StringBuffer和 StringBuilder
它们在使用中没有区别,但是StringBuffer是线程安全的,而StringBuilder非线程安全,效果较高。
HashMap Hashtble
Hashtable是线程安全的。
ArrayList Vector
Vector是线程安全的。
线程是CPU 调度和分派的基本单位,它是进程中执行运算的最小单位,可完成一个独立的顺序控制流程。
创建线程的两种方式
Thread类
runnable接口
CPU 抢占式调度