说进程之前首先说一下程序,程序是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念.
进程就是程序的一次执行过程,是一个动态的概念,是系统分配资源的单位.
而一个进程由若干个线程组成,进程中至少要有一个线程,不然就没有存在的意义,线程是CPU调度和执行的单位.是独立的执行路径
第一种实现:
继承Thread类
package com.lei.thread;
//实现多线程方式一:继承Thread类
public class Thread1 extends Thread{
//重写run方法,编写线程执行体
注意:线程的run()方法是由java虚拟机直接调用的,如果我们没有调用线程的start()方法,而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,所以不会创建引得线程
如上面代码:在main方法中执行的run()方法不会创建新的线程,而在main方法中执行的start()方法会启动一个新的线程,新的线程再去调用run方法
第二种实现:
实现Runnable接口
package com.lei.thread;
//实现多线程方式二:实现Runnable接口
public class Thread2 implements Runnable{
//重写run方法,编写线程执行体
第三种实现:
实现Callable接口
Callable接口类似于Runnable,两者都是实现接口,但是Callable的call()方法可以有返回值,并且可以抛出异常。但是Runnable不行。
另外,需要创建一个FutureTask对象用来获取结果以及传递参数给线程对象
package com.lei.thread;
import java.util.concurrent.*;
//实现多线程方式三:实现Callable接口,这里的泛型是返回值的类型
public class Thread3 implements Callable<String> {
//重写call方法,抛出异常,编写线程执行体,
第四种实现
线程池方式
package com.lei.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Thread4 implements Runnable{