Java多线程详解之一:线程创建
一、线程、进程、多线程
1、线程与进程定义
- 进程:进程是系统进行资源分配和调度的基本单位,是操作系统中一个运行的程序,是线程的容器;
- 线程:线程是处理机调度的最小单位,包含在进程中,是进程中实际运作单位;
一个例子:比如说我们的华为手机,操作系统是安卓,手机里的应用是进程,比如微信,而微信里的发语音、发文字、拍一拍等功能就是一个个线程。
2、线程与进程的区别
- 调度:线程是处理机调度的基本单位,进程是资源分配的基本单位;
- 拥有资源:进程拥有独立的资源,线程不拥有资源,但可以共享其隶属的进程资源;
- 系统开销:进程>>线程;
- 关系:进程包含线程,线程被包含在进程中,即一个线程只能属于一个进程,但一个进程可以有多个线程,且至少有一个线程,如下图所示:

二、单线程与多线程的区别
单线程是一个程序顺序的执行事务,而多线程是一个程序可以同时执行多个事务,如下图:

对于单线程,我们必须顺序执行事务,先执行eat(),执行完eat()后,再执行watchTV(),就好比你有一个严格的妈妈,他不允许你边吃饭边看电视,必须吃过饭后才可以去看电视;
对于多线程,我们可以在执行eat()的时候,同时开始执行watchTV(),就好比你有一个宽容的妈妈,他允许你边吃饭边看电视;
三、Java线程创建

1、继承Thread类实现多线程【重点】
- 自定义一个线程类,并继承Thread类
- 重写Thread类中run()方法,编写线程执行体
- 创建线程对象,调用start()方法以启动线程
//1.创建线程类,并继承Thread类 public class TestThread extends Thread{ //2.重写Thread类的run()方法 @Override public void run() { for(int i = 0; i < 20; i++){ //currentThread方法是Thread类的一个方法,用于获取当前线程 System.out.println(Thread.currentThread().getName()+"-->"+i); } } public static void main(String[] args) { //3.新建线程类对象 TestThread thread1 = new TestThread(); TestThread thread2 = new TestThread(); TestThread thread3 = new TestThread(); //4.调用start()方法(继承自Thread类) thread1.start(); thread2.start(); thread3.start(); } }
2、实现Runnable接口【重点】
- 创建线程类,并实现Runnable接口
- 重写Runnable接口的run()方法
- 创建线程类对象
- 创建Thread类对象,并将线程类对象作为Thread构造器的参数
- 调用Thread对象的start()方法
//1.创建线程类,并实现Runnable接口 public class TestRunnable implements Runnable{ //2.重写Runnable的run()方法 @Override public void run() { for(int i = 0; i < 20; i++){ //currentThread方法是Thread类的一个方法,用于获取当前线程 System.out.println(Thread.currentThread().getName()+"-->"+i); } } public static void main(String[] args) { //3.创建线程类对象 TestRunnable thread = new TestRunnable(); //4.创建Thread对象,传入线程类对象作为Thread构造器参数 Thread thread1 = new Thread(thread); Thread thread2 = new Thread(thread); Thread thread3 = new Thread(thread); //5.调用每个Thread对象的start()方法 thread1.start(); thread2.start(); thread3.start(); } }
3、实现Callable接口【了解】
- 新建线程类实现Callable接口
- 重写Callable接口的call()方法
public class MyThread implements Callable<String> { private int count = 20; @Override public String call() throws Exception { for (int i = count; i > 0; i--) { System.out.println(Thread.currentThread().getName()+"当前票数:" + i); } return "sale out"; } public static void main(String[] args) throws InterruptedException, ExecutionException { Callable<String> callable =new MyThread(); FutureTask <String>futureTask=new FutureTask<>(callable); Thread mThread=new Thread(futureTask); Thread mThread2=new Thread(futureTask); Thread mThread3=new Thread(futureTask); mThread.start(); mThread2.start(); mThread3.start(); System.out.println(futureTask.get()); } }
注:创建线程的三种方法中,1)继承Thread类 以及2)实现Runnable方法 是重点需要掌握的方法,3)实现Callable 作为了解即可,在开发中应用较少。
欢迎关注微信公众号,不定期分享学习笔记与资料,与Mike一起学java,谢谢~

浙公网安备 33010602011771号