1.并发性
多任务:在同一刻运行多个程序的能力。如今单台计算机可能拥有多个cpu,但是并发执行的进程数目并不是由cpu的数目制约的。操作系统将cpu的时间片分配给每一个进程,给人并行处理的感觉
多线程程序:通常,每一个任务称为一个线程,多线程程序指可以同时运行一个以上线程的程序
2.线程
线程(英语:thread):操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程:指的是这个程序(一个进程)运行时产生了不止一个线程
常见方法:java.lang.Thread中的方法:
- static void sleep(long millis) 参数:mills 休眠的毫秒数
- void start() 启动这个线程,将引发调用run()方法。这个方法将离级返回,并且新线程并发运行
- void run() 必须覆盖这个方法,并且在这个方法中提供要执行的任务指令
- void interrupt() 向线程发送中断请求。线程的中断状态被设置为true,如果该线程被阻塞,则抛出InterruptedException异常
- static boolean interrupted() 测试当前线程是否被中断。该方法为静态方法,调用时会将当前线程的中断状态设置为false
- boolean isInterrupted() 测试线程是否被终止,该方法不是静态方法,不改变线程的中断状态
- static Thread currentThread() 返回代表当前执行线程的Thread对象
2.1中断线程
当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。在java早期的版本中,有stop方法,其他线程可调用它终止线程,但是现已弃用。
没有可以强制终止线程的方法,但是可以用interrupt()方法请求终止线程,当对一个线程调用该方法时,线程的【中断状态】将被置位。这是每一个线程都具有的boolean标志。每个线程都应该不时的检查这个标志,以判断线程是否被中断。我们可以使用
Thread.currentThread.isInterrupted()
方法判断该线程是否中断,但是当该线程阻塞时(调用sleep()方法或者wait()方法时),会抛出InterruptedException异常。
2.2线程状态
线程状态:
- New (新创建)
- Runnable (可运行)
- Blocked (被阻塞)
- Waiting (等待)
- Timed waiting (计时等待)
- Terminated (被终止)
要确定一个线程的当前状态,可调用getState方法
新线程创建:
当new一个新线程时,该线程还没有开始运行。
可运行线程:
一段调用start方法,线程处于runnable状态。一个可运行线程可能正在运行、可能也没有,这取决于操作系统给线程提供运行的时间。一旦一个线程开始运行,它不必始终保持运行。运行中的线程被中断,目的时为了让其他线程获得运行机会。
线程调度的细节依赖于操作系统提供的服务。【抢占式调度系统】给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行机会。当选择下一个线程时,操作系统考虑线程的优先级。