一 、多线程的概念程
1.1 进程和线程的区别
进程:进程是一种正在运行的程序,有独立的运行空间和系统资源
线程:线程是进程中一个最小的执行单位,可以从头至尾的完成认为执行流程
1.2 主线程与子线
主线程:Java程序默认启动的线程,由虚拟机创建线程的入口-main方法
子线程:由主线程启动起来的线程则是子线程
二、 多线程的使用
2.1 创建线程的方式
一 Thread方式
1 继承Thread类,重写Thread类的run方法
2 创建Thread子类对象
3 调用子类对象的start()方法
二 Runnable方式
1 实现Runnable接口,创建接口的实现类对象
2 创建Thread类行对象,并在构造方法中传入接口实现类对象
3 调用线程对象的start()方法
注意:
1 Thread实现了Runnable类,可以定义Thread的子类并覆盖run方法实现自定义的线程类
2 不推荐这种方式,因为这将任务和运行任务的机制混在了一起
3 任务与线程分离更好的体现了面想对象思想,避免了由Java单继承带来的局限及有利于代码被多个线程共享
2.2 创建线程的代码实例
/** 继承Thread类的方式创建方式*/
public class ThreadDemo1 extends Thread {
@Override
public void run() {
System.out.println("用继承Thread的方式创建线程");
}
public static void main(String[] args) {
ThreadDemo1 threadDemo1=new ThreadDemo1();
threadDemo1.start();
}
}
/** 用实现Runnable的方式创建线程 */
public class ThreadDemo2 {
public static void main(String[] args) {
ThreadRunnable threadRunnable =new ThreadRunnable();
Thread thread=new Thread(threadRunnable);
thread.start();
}
}
class ThreadRunnable implements Runnable{
@Override
public void run() {
System.out.println("用实现Runnable的方式创建线程");
}
}
2.3 线程中的主要方法
Thread():创建一个空线程
Thread(tasl:Runnable):为指定任务创建一个线程
start():void:启动线程,使run方法能够被JVM调用
isAlive():boolean:返回当前线程是否正在运行
setPriority(prionity:int):void:设置线程的优先级(1-10)
join():等待当前线程结束
sleep(millis:long):void:使线程休眠指定毫秒数
yield():void:使线程暂停并允许执行其他线程(但是此方法只是暂停线程,让此线程与其他线程回到同一的起跑线,有可能还是此线程先抢到使用权)
三 、线程的生命周期
3.1 线程的主要状态
新生:创建对象
就绪:准备执行
运行:正在执行,此处可能根据情况随时回到就绪状态
阻塞:线程因为某种原因在等待执行
死亡:执行结束
3.2 线程的优先级
设置优先级的方法:setPriority(prionity:int):void:设置线程的优先级(1-10)
注意:
1、优先级表示重要程度或紧急程度,不能决定是否一定先执行(不一定能抢到资源)
2、为避免竞争现象,高优先级的线程可以定时调用sleep()方法或yield()方法,来给低优先级或相同优先级线程运行的机会
3、线程优先级设置会影响线程抢占资源的概率,但是优先级不会绝对的影响执行,即优先级越高概率越高,但不会导致低优先级的线程无法执行
3.3 线程休眠
1 Thread.sleep()
Thread.sleep(毫秒),会让当前线程进入休眠状态,此时没有资源耗费
2 TImeUnit
TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段
主要作用
时间颗粒度转换
延时
常用的颗粒度
TimeUnit.DAYS 天
TimeUnit.HOURS 小时
TimeUnit.MINUTES 分钟
TimeUnit.SECONDS 秒
TimeUnit.MILLISECONDS 毫秒
时间颗粒度转换代码如下:
pubilc long toMillis(long d) //转化成毫秒
public long toSeconds(long d) //转化成秒
public long toMinutes(long d) //转化成分钟
public long toHours(long d) //转化成小时
public long toDays(long d) //转化成天
延时方法
TimeUnit.DAYS.sleep(天);
TimeUnit.HOURS.sleep(小时);
TimeUnit.MINUTES.sleep(分钟);
TimeUnit.SECONDS.sleep(秒);
TimeUnit.MILLISECONDS.sleep(毫秒);