进程简单地说就是在多任务操作系统中,每个独立执行的程序,所以进程也就是“正在进行的程序”。(windows os 我们可以在任务管理器中看到进程)
线程是程序运行的基本执行单元。当操作系统执行一个程序时,会在系统中建立一个进程,该进程必须至少建立一个线程(这个线程被称为主线程)作为这个程序运行的入口点。因此,在操作系统中运行的任何程序都至少有一个线程。
进程启动后线程开始执行任务,多线程并发处理任务可以大大提高程序的执行效率。但一个CPU核心在同一时间只能执行一个线程,不能同时执行两个任务。为了提高程序运行的效率,操作系统会在一个线程空闲时会撤下这个线程,并且会让其他的线程来执行,这种方式叫线程调度。
JVM的线程调度:
JVM的线程调度使用抢占式调度,Java中线程会按优先级分配CPU时间片运行,且优先级越高越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。
系统中的进程是在各自独立的内存空间中运行,进程和进程之间是不共享内存的。
一个进程中的线程可以共享系统分配给这个进程的内存空间。并且拥有一个属于线程自己的内存空间叫做线程栈。线程栈是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数(方法)时所定义的变量。
线程自己的内存空间叫做线程栈,每个线程都有自己独立的空间互不干涉。但是对于其他公共内存是可以共享的,比如堆内存,方法区。
java.lang.Thread是线程类,可以用来给进程创建线程处理任务使用。要使用线程先介绍两个比较重要的方法
Thread类本身就是指线程
步骤
例子
class ThreadTest extends Thread{ @Override public void run(){ System.out.println("ThreadTest线程开始-------------------------------"); for (int i = 0; i < 100; i++) { System.out.println("ThreadTest线程" + i); } System.out.println("ThreadTest线程结束-------------------------------"); } } public class MyThread { public static void main(String[] args) { System.out.println("main线程开始-------------------------------"); // 创建一个线程对象 Thread th = new ThreadTest(); // 启动线程 th.start(); // 开辟一个新的线程栈,并把run方法加载到线程栈中执行 for(int i = 1000; i < 1100; i++){ System.out.println("main线程" + i); } System.out.println("main线程结束-------------------------------"); } }
效果
这种方法是使用如下构造方法,指定任务给线程执行
public Thread(Runnable target) public Thread(Runnable target, String name)
参数中的Runnable是一个接口,用来定义线程要执行的任务,如下
public interface Runnable{ public abstract void run(); } // 线程启动后就会执行该run方法了
开发中是推荐使用此方式
创建一个实现Runnable接口的子类,Runnable接口是定义线程要执行线程任务,此方式有如下优点