Java多线程简介和简单使用
Posted 木木林Violet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程简介和简单使用相关的知识,希望对你有一定的参考价值。
Java多线程简介
1. 线程简介
1.1. 线程概念
一个线程就是一个“执行流”。
每个线程之间都可以按照顺序执行自己的代码,彼此之间相对独立,同时每个线程都会执行多份代码。
1.2. 进程概念
进程是指运行起来的程序,程序运行起来需要被加载到内存中。
1.3. 线程作用
- 最早的CPU是单核的,但随着CPU的发展,CPU也遇到了瓶颈,于是为了进一步提高算力,便发展出了多核的CPU,而并发编程则可以更加充分的利用这一特性来充分利用CPU的资源。
- 有一些的任务是需要“等待IO”数据的,但在等待的这个过程中CPU是空闲的,为了提高效率,于是可以用到并发编程。
1.4. 进程和线程的联系
- 进程和线程是1:m的关系:一个线程一定属于一个进程,但一个进程可能有多个线程。一个进程内至少有一个线程,这一开始就有的线程被称为主线程。
- 创建线程比创建进程更快,销毁线程比销毁进程更快,调度线程比调度进程更快。
- 进程是操作系统资源分配的基本单位,线程是操作系统进行调度的基本单位。
- 线程间是相互独立的(隔离性),但进程间是要相互通信的。
- 进程和进程之间不共享内存空间,但一个进程的线程之间是共享一个内存空间的。
2. 线程执行
2.1. 示例
import java.util.Random;
public class ThreadDemo
private static class MyThread extends Thread
@Override
public void run()
Random random = new Random(); while (true)
// 打印线程名称
System.out.println(Thread.currentThread().getName());
try
// 随机停止运行 0-9 秒
Thread.sleep(random.nextInt(10));
catch (InterruptedException e)
e.printStackTrace();
public static void main(String[] args)
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
Random random = new Random();
while (true)
// 打印线程名称
System.out.println(Thread.currentThread().getName());
try
Thread.sleep(random.nextInt(10));
catch (InterruptedException e)
// 随机停止运行 0-9 秒
e.printStackTrace();
//结果
Thread-0
Thread-0
Thread-2
Thread-1
Thread-2
Thread-1
Thread-0
Thread-2
main
main
Thread-2
Thread-1
Thread-0
Thread-1
main
Thread-2
Thread-2
......
2.2. 解释
在上述的代码和结果中,可以看出:
- 在多个线程中,每个线程间的执行顺序是随机的,和线程的启动顺序无关。
- 每个线程都有自己独立的调用栈。
2.3. 线程在内存中的分配
- PC(保存PC的值)、栈(虚拟机栈、本地方法栈)是每个线程独一份的。
- 因为每个线程都是独立的执行流,吓一跳要执行的指令和其他线程无关,所以又自己的PC值。
- 因为每个线程都是独立的执行流,有各自调用的方法链,有各自要处理的临时数据,所以栈也是独一份的。
- 局部变量保存在栈帧中,也就是保存在栈中,所以是线程私有的,表现为A创建的局部变量,只有A可以 使用。
- 类对象(Class对象)、静态属性保存在方法区中,所以是线程之间共享的,前提是有访问权限。
- 对象(对象内部的属性)保存在堆中,所以是线程之间共享的,前提是线程持有该对象的应用。
2.4. 创建线程
创建线程有两种办法:继承Thread类、实现Runnable接口。
2.4.1. 继承Thread类
- 继承Thread来创建一个线程类。
class MyThread extends Thread
@Override
public void run()
System.out.println("这里是线程运行的代码");
- 创建MyThread类的实例。
MyThread t = new MyThread();
- 条用start方法来启动线程。
t.start(); // 线程开始运行
2.4.2. 实现Runnable接口
- 实现Runnable接口
class MyRunnable implements Runnable
@Override
public void run()
System.out.println("这里是线程运行的代码");
- 创建Thread类实例,调用Thread的构造方法时将Runnable对象作为target参数。
Thread t = new Thread(new MyRunnable());
- 调用start方法。
t.start(); // 线程开始运行
2.4.3. 对比
- 继承Thread类,直接调用this就代表了当前线程对象的引用。
- 实现Runnable接口,this表示的是MyRunnable的引用,而正确的调用应该使用Thread。currentThread()。
以上是关于Java多线程简介和简单使用的主要内容,如果未能解决你的问题,请参考以下文章