什么叫做进程?
进程是操作系统中的一个任务,他是包含了某些资源的内存区域。一个进程可以包含了一个或多个执行单元称作线程,这些线程可以被看做是同时执行的(实际是轮流占用CPU资源,快速切换,达到看似同时执行)。每个进程还有一个私有虚拟的地址空间,该空间只能被包含的线程所访问。当操作系统创建一个进程之后,该进程会自动申请一个名为主线程的线程。
什么叫做线程?
一个线程是进程的一个顺序执行流,同类的线程可以共享一块内存空间和一组系统资源。线程在切换的时候负荷很小,因此,线程也被成为轻进程。一个进程可以包含多组线程。
进程和线程的区别?
一个进程最少有一个线程,线程的划分尺度要比进程小,为什么这么谁呢。因为每个进程在执行过程中都有一块独立的内存单元,进程在切换时候需要消耗大量资源。而多个线程是共享这块内存的,在线程切换过程中并不需要切换内存单元,所以极大的提高了运行效率。多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将这些线程看做独立运行的程序来进行进程调度和资源分配。
并发与并行?
多个线程同时执行,这只是在宏观上看的。事实上是OS将CPU运行时间划分为许多时间片,获得时间片的线程执行,其他的线程等待。由于切换速度非常快,所以在宏观上是同时执行的,但微观上并不是,这种叫做并发。而并行是无论微观还是宏观都是同时执行的,这里通过多个CPU可以实现并行执行程序。
创建线程
使用Thread创建线程并启动线程
通过继承Thread类,并且重写Thread类中run方法来定义一个具体的线程。重写run方法的目的在于定义线程要执行的逻辑。启动线程不是调用run方法,而是调用线程的start()方法。start()方法将线程纳入线程调度序列,是当前线程获取时间片段后可以执行。Thread类是一个线程类,每个实例表示一个可以并发运行的线程。
class SampleThread extends Thread {
public void run() {
System.out.println("通过继承Thread类重写run方法实现");
}
public static void main(String[] args) {
SampleThread thread = new SampleThread();
thread.start();
}
}
使用Runnable创建并启动线程
实现Runnable接口并且重写run方法定义线程体,然后创建线程的时候将Runnable实例传入并启动线程。这样做的好处是,将定义线程与线程要执行的任务分开来,来减少耦合。并且,java是单继承的,如果一个类继承了Thread类,就无法继承其他类了。(Thread类也是实现Runnable接口的)
在Runnable接口中,只定义了抽象run方法:
public abstract void run();
class SampleThread implements Runnable {
public void run() {
System.out.println("通过继承Thread类重写run方法实现");
}
public static void main(String[] args) {
SampleThread sample = new SampleThread();
Thread thread = new Thread(sample);
thread.start();
}
}
使用匿名内部类创建线程
Thread thread = new Thread(){
public void run() {
};
};
中断线程
当执行完run方法,或者没有捕获异常而使线程终止。但是如果想强制终止线程,可以使用interrupt方法来请求终止线程。
线程中断是改变线程的中断状态,中断之后可能是死亡、可能是等待新的任务、可能是继续执行到下一步,这个要看程序本身。线程会不断检测这个中断标识位,以判断是否应该被中断。但是如果线程被阻塞,在使用interrupt终止线程,会抛出InterruptedException异常。
使用isInterrupted来检测线程是否被中断
boolean isInterrupted()
boolean interrupted():测试当前线程是否被中断,但是这一调用会产生副作用,他将当前线程中断状态设置为false
void interrupt():发送中断请求,中断状态被设置为true
线程状态
线程可以有6中状态:
New:新创建
Runnable:可运行</