多线程的实现方式(实现多线程的四种基本方式)

线程概述利用多线程技术可以使系统同时运行多个程序块,缩短出程序响应的时间,提高计算机资源的利用率,达到多任务处理的目的。进程和线程进程是程序的一次动态执行过程,每个进程都有自己独立的内存空间。一个应用

以下内容:”多线程的实现方式(实现多线程的四种基本方式)”由本网站整理分享!。

多线程的实现方式(实现多线程的四种基本方式)

线程概述

利用多线程技术可以使系统同时运行多个程序块,缩短出程序响应的时间,提高计算机资源的利用率,达到多任务处理的目的。

进程和线程

进程是程序的一次动态执行过程,每个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程(比如浏览器可以开多个窗口,每个窗口就是一个进程)

多进程操作系统能够运行多个进程,每个进程都能够循环利用所需要的CPU时间片,使得所有进程看上去像在同时运行一样。

线程是进程的一个执行流程,一个进程可以由多个线程组成,也就是一个进程可以同时运行多个不同的线程,每个线程完成不同的任务。

线程的并发运行:就是一个进程内若干个线程同时运行。(比如:word的拼写检查功能和首字母自动大写功能是word进程中的线程)

线程和进程的关系是一个局部和整体的关系,每个进程都由操作系统分配独立的内存地址空间,而同一进程的所有线程都在同一地址空间工作。

多线程的实现方式(实现多线程的四种基本方式)(1)

线程的生命周期

一个线程的完整生命周期要经历5种状态:新建、就绪、运行、阻塞、死亡

多线程的实现方式(实现多线程的四种基本方式)(2)

多线程的实现方式(实现多线程的四种基本方式)(3)

新建状态:使用new和某种线程的构造方法来创建线程对象,该线程就会进入新建状态,系统为该线程对象分配内存空间。处于新建状态的线程可以通过调用**start()**方法进入就绪状态。

就绪状态:此时线程已经具备了运行的条件,进入了线程队列,等待系统分配CPU资源,一旦获得CPU资源,该线程就会进入运行状态。

运行状态:进入运行在状态,线程会执行自己的**run()**方法中的代码。

阻塞状态:一个正在执行的线程,如果执行了suspend、join或sleep方法,或等待io设备的使用权,那么该线程将会让出自己的CUP控制权并暂时中止自己的执行,进入阻塞状态。阻塞的线程,不能够进入就绪队列,只有当阻塞原因被消除的时候,线程才能进入就绪状态,重新进入线程队列中排队等待CPU资源,然后继续执行。

死亡状态:一个线程完成了全部工作或者被提前强制性的终止,该线程就处于死亡状态。

线程常用方法归纳

多线程的实现方式(实现多线程的四种基本方式)(4)

多线程的实现方法

案例

1、继承Thread类,重写run方法来实现多线程

public class MyThread extends Thread{ private String name;//线程名 public MyThread() { } public MyThread(String name) { this.name = name; } //完成线程功能的主体代码都在run()方法中 @Override public void run() { for (int i = 0; i < 3; i++){ System.out.println(name + “执行功能” + i); } }}public class ThreadDemo { public static void main(String[] args) { //定义线程 MyThread thread1 = new MyThread(“线程A”); MyThread thread2 = new MyThread(“线程B”); MyThread thread3 = new MyThread(“线程C”); MyThread thread4 = new MyThread(“线程D”); MyThread thread5 = new MyThread(“线程E”); MyThread thread6 = new MyThread(“线程F”); //调用start()方法启动线程,让其进入就绪状态,等待系统分配CPU资源进入运行状态调用run()方法 thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread5.start(); thread6.start(); }}

运行结果:(基于4核计算机)运行三个线程(顺序执行)

多线程的实现方式(实现多线程的四种基本方式)(5)

运行6个线程(交互执行)

多线程的实现方式(实现多线程的四种基本方式)(6)

2、继承Runnable接口实现多线程

重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

class MyRunnable implements Runnable { @Override public void run() { for(int i = 0; i < 3; i++){ System.out.println(Thread.currentThread().getName()+”运行功能”+i); } }}public class RunnableDemo { public static void main(String[] args) { //定义线程 MyRunnable mt1 = new MyRunnable(); MyRunnable mt2 = new MyRunnable(); MyRunnable mt3 = new MyRunnable(); MyRunnable mt4 = new MyRunnable(); MyRunnable mt5 = new MyRunnable(); MyRunnable mt6 = new MyRunnable(); //利用Runnable接口子类对象来实例化Thread对象 Thread thrad1 = new Thread(mt1,”线程1″); Thread thrad2 = new Thread(mt2,”线程2″); Thread thrad3 = new Thread(mt3,”线程3″); Thread thrad4 = new Thread(mt4,”线程4″); Thread thrad5 = new Thread(mt5,”线程5″); Thread thrad6 = new Thread(mt6,”线程6″); //启动线程 thrad1.start(); thrad2.start(); thrad3.start(); thrad4.start(); thrad5.start(); thrad6.start(); }}

运行结果:

多线程的实现方式(实现多线程的四种基本方式)(7)

继承Thread类和实现Runnable接口完成多线程的区别

实现Runnable接口可以做到资源共享,而继承Thread类不行(比如购票问题)实现Runnable接口相比继承Thread类来说,具有两大优势:避免单继承带来的局限和可以共享资源等优势相比Thread类的继承,一般采用实现Runnable接口来实现多线程

3、通过Callable 和 FutureTask创建线程

3.1 创建Callable接口的实现类 ,实现它的Call方法3.2 使用FutureTask类来包装Callable对象,这个FutureTask对象需要封装Callable对象的Call方法的返回值3.3 使用FutureTask对象作为Thread对象的target创建并调用start方法启动线程

//1. 创建Callable接口的实现类 ,实现它的Call方法class MyCallable<T> implements Callable<T>{ //重写Callable的call方法 @Override public T call() throws Exception { System.out.println(Thread.currentThread().getName() + ” —->通过实现Callable接口来实现线程”); return null; }}public class Callable_FutureTask { public static void main(String[] args) { //2. 实例化Callable对象 Callable<Object> callable = new MyCallable<Object>(); //3. 使用FutureTask类来包装Callable对象 FutureTask<Object> futureTask = new FutureTask<Object>(callable); //使用FutureTask对象作为Thread对象的target创建并调用start方法启动线程 Thread thread1 = new Thread((futureTask),”线程A”); System.out.println(“当前运行线程名:” + Thread.currentThread().getName()); //启动线程 thread1.start(); }}

运行结果:

多线程的实现方式(实现多线程的四种基本方式)(8)

4、通过线程池实现多线程

class MyRunnable implements Runnable{ @Override public void run() { System.out.println(“通过线程池的方式创建的线程,线程名 :” + Thread.currentThread().getName()); }}public class ThreadPool { //设置线程池的数量 private static int threadPoolNum = 8; public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for(int i = 0; i < threadPoolNum; i ++) { //创建线程对象 MyRunnable thread = new MyRunnable(); //Thread.sleep(1000);//使线程休眠1秒 executorService.execute(thread); } }}

运行结果:

多线程的实现方式(实现多线程的四种基本方式)(9)

关于线程注意事项Java中,所有线程都是同时启动的,哪个线程占有CPU等运行资源,哪个线程就可以运行。Java程序每次运行都需要启动两个线程(main线程和垃圾收集器线程)Java线程运行过程中,其他线程并不会随着主线程的结束而结束。

以上就是关于“多线程的实现方式(实现多线程的四种基本方式)”希望能帮助到你!

本文来自投稿,不代表路由百科立场,如若转载,请注明出处:https://www.qh4321.com/175673.html

(0)

相关推荐

  • 教你优酷路由宝如何持续赚取优金币

    由于在使用路由宝之前已有一个路由器在拨号上网,因此路由宝只作为二级路由使用,也因为路由宝默认WAN口为自动获取IP地址

    2020年8月29日
  • 宽带连接已拒绝远程连接因为未识别(图文)

    【导读】宽带连接已拒绝远程连接因为未识别,下面就是路由器之家整理的网络知识百科,来看看吧!大家好,我是191路由器网小编,上述问题将由我为大家讲解。宽带连接已拒绝远程连接因为未识别,其原因如下:  

    2021年7月18日
  • 在Win10上安装和卸载远程服务器管理工具的方法(图)

    原标题:”在Win10上安装和卸载远程服务器管理工具的方法”相关电脑问题教程分享。 – 来源:路由器之家。很多时候,我们在Win10系统中不能随意更改远程服务器上的角色和功能。但是如果安装了远程服务

    2021年7月8日
  • 疯读小说免费领手机是真的吗?

       疯读小说免费领手机是真的吗?相信大家在刷视频或者看广告时,可以看到疯读小说的广告说可以免费送大家华为P30手机,那这个到底是真的还是假的呢,疯读小说真的会送华为P30手机吗,…

    2022年8月14日
  • word中插入和改写怎么弄

    路由器网投稿:文章是关于”word中插入和改写怎么弄”的相关知识分享,希望可以帮到大家。 – 素材来源网络 编辑:小易。 word中插入和改写怎…

    2022年8月3日
  • 有线网络与无线网络的优缺点

    【导读】有线网络与无线网络的区别,下面就是路由器之家整理的网络知识百科,来看看吧!大家好,我是191路由器网小编,上述问题将由我为大家讲解。有线网络与无线网络的区别如下:  1、一个要线路,一个不要

    2021年7月25日