写点什么

线程的介绍与创建

  • 2021 年 11 月 12 日
  • 本文字数:1687 字

    阅读完需:约 6 分钟

这博客是对自己学习的一点点总结及记录,如果您对 Java算法 感兴趣,可以关注我的动态,我们一起学习。



用知识改变命运,让我们的家人过上更好的生活

目录


一、线程与进程的区别




1.进程:是程序的一次执行过程,或是正在运行的一个程序 。由程序、数据和进程控制块三部分组成。比如 运行中的 IDEA,vscode


2.线程:是进程中实际运作的单位,是一个程序内部的一条执行路径。


总结:一个操作系统可以同时执行多个任务,每个任务就是一个进程;一个进程可以执行多个任务,每个任务就是线程。


3.两者之间的关系:一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程,即主线程。多个线程共享进程的全部系统资源,同时线程还拥有自己独立的程序计数器、虚拟机栈、本地方法栈。


二、使用多线程的好处




  1. 进程之间不能共享内存;线程之间相互独立,且共享进程中的资源,提高计算机 CPU 的利用率。

  2. 多线程技术使程序的响应速度更快,增强用户的体验。


三、线程的创建和启动



1.继承 Thread 类 创建线程

  • 定义一个继承 Thread 类的子类;

  • 重写该类的 run()方法,将线程执行的操作声明在 run()方法里面;

  • 创建 Thread 类子类的对象;

  • 调用线程对象的 start()方法来启动线程。


// 1.创建一个继承于 Thread 类的子类


class MyThread extends Thread {


// 2.重写 Thread 类的 run 方法


@Override


public void run() {


for (int i = 0; i <= 100; i++) {


if (i % 2 == 0) {


System.out.println(Thread.currentThread().getName()+": "+i);


}


}


}


}


public class ThreadTest {


public static void main(String[] args) {


// 3.创建 Thread 类子类的对象


MyThread t1 = new MyThread();


// 4.通过此对象调用 start


t1.setName("线程 A");


t1.start();


MyThread t2 = new MyThread();


t2.setName("线程 B");


t2.start();


}


}

2.实现 Runnable 接口 创建线程

  • 定义一个实现了 Runnable 接口的类;

  • 重写 run()方法,将线程执行的操作声明在 run()方法里面;

  • 创建实现类的对象;

  • 将此对象传递到 Thread 类的构造器中创建 Thread 对象;

  • 调用线程对象的 start()方法启动该线程。


// 1.创建一个实现 Runnable 接口的类


class MyThread implements Runnable {


// 2.实现类去实现 Runnable 中的抽象方法 run()


@Override


public void run() {


for (int i = 0; i < 100; i++) {


if (i % 2 == 0) {


System.out.println(Thread.currentThread().getName()+":"+i);


}


}


}


}


publi


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


c class ThreadTest2 {


public static void main(String[] args) {


// 3.创建实现类的对象


MyThread m = new MyThread();


// 4.创建 Thread 类的对象


Thread t1 = new Thread(m);


t1.setName("线程 A");


// 5.启动线程


t1.start();


Thread t2 = new Thread(m);


t2.setName("线程 B");


t2.start();


}


}


两种方式的比较



两种方式都需要重写 run(),将线程要执行的操作声明在 run()中。


第一种方式是继承 Thread 类,因 Java 是单继承,如果一个类继承了 Thread 类,那么就没办法继承其它的类了。


第二种 实现的方式没有类的单继承性的局限性,实现的方式更适合来处理多个线程有共享数据的情况。所以实际开发就使用第二种方式。

3.使用 Callable 和 Future 创建线程

从 Jdk 1.5 开始,Java 提供了 Callable 接口,Callable 接口提供了 Call()方法作为线程的执行体。call()方法可以有返回值,也可以声明抛出异常,因此它可看作是 Runable 接口的增强版。


  • 创建一个 Callable 的实现类,实现 Call 方法,将此线程需要执行的操作声明在 Call 方法里面;

  • 创建 Callable 接口的实现类对象;

  • 将此对象传递到 FuterTask 构造器中,创建 FuterTask 对象;

  • 创建 Thread 对象,调用 start 启动线程;

  • 调用 FuterTask 对象的 get()方法来获得线程结束后的返回值;


class MyThread implements Callable {


@Override


public Object call() throws Exception {


int sum = 0;


for (int i = 0; i <= 20; i++) {


System.out.println(Thread.currentThread().getName() + ":" + i);


sum += i;


}

评论

发布
暂无评论
线程的介绍与创建