多线程—线程基础(一)
一、线程基础
- CPU时间分片:CPU本身是按顺序执行机器指令,在某一时刻执行一个程序的指令。当前的多任务操作系统可表面实现同时处理多个任务。即每个任务轮流占用CPU,如果每个时间片足够短,以至于不能感觉到,就可以表现出在同一时间执行多个任务。
- 进程和线程:进程和线程区别在于进程拥有独立的内存空间,而线程通常与其他线程共享空间,共享空间有利于线程之间的通信、协调配合,但共享内存空间可能导致多个线程在读写内存时数据不一致,这是使用多线程必须面对的风险。相对于进程来说,线程是一种更轻量级的多任务实现方式,创建、销毁一个线程消耗的计算机资源比进程要小得多。
- 多线程应用:提高运算速度、缩短响应时间。对于计算量比较大的任务可以把任务分解成多个可以并行运算的小任务,每个小任务由一个线程执行运算,以提高运算速度。
二、创建线程
- 实现Runnable接口
- 继承Thread类
线程是驱动任务运行的载体,在Java中要执行的任务定义在run()方法中,线程启动后将执行run()方法,方法执行完后任务就执行完成。
public class ThreadTest {
public static void main(String[]args){
System.out.println("开启线程测试");
//创建线程对象
Thread t = new Thread(new MyRunnable);
//启动线程
t.start();
System.out.println("线程测试完毕");
}
class MyRunnable implements Runnable{
public void run(){
for(int i=0;i<10;i++)
System.out.println("重写线程中!!!")
}
}
}
线程对象创建后,并不会启动线程执行任务,而需要调用start()方法启动任务,启动后执行run(),run()方法执行完毕或者抛出异常后线程将执行完成。start()启动线程后,不会等待run()方法执行完毕,而是马上返回。
三、优先级
在Java中有一个程序负责为每一个线程分配CPU时间片,负责分配时间片的程序成为调度器,分配原则是余额紧急的线程分配的时间片就越多,以利于紧急的任务优先完成。调度器的时间分配原则与操作系统有密切的关系,不同操作系统对任务的紧急程度的分级也不一样。比如:Java虚拟机的优先级为10个级别,Windows上只有7个级别。
四、休眠
休眠是指线程在运行的过程中暂时停止运行,线程调度器不为线程分配时间片。休眠期间不占用CPU时间,在休眠结束后,线程继续运行,Thread类的sleep(long mills)方法使当前线程休眠,参数单位为毫秒。
五、中断
种种原因,可能会想要另一线程在执行完毕之前终止,Thread类的interrupt()方法可以用来请求终止线程。但interrupt()方法并不能强制终止线程执行,而是设置线程对象的中断状态,每个线程都有一个boolean型的属性标志线程是否能够被外部中断(中断状态)。如果线程调用了interrupt()方法,则中断状态为true。
//如果线程没被请求中断,并且还有未被完成的工作,则继续执行循环体
while(……){
if(Thread.currentThread.isInterrupted()){//如果进入中断
//响应中断请求,首先决定是否终止线程,
//若终止线程必须做完必须要做的工作后退出run方法
}
//处理为完成的工作
}