Java多线程 - 如何构造一个线程? 小灰灰 2022-05-09 03:08 226阅读 0赞 首先要明白`start`和`run`这两个方法。`start`方法意为启动一个线程,并不是立马执行这个线程,而是表示这个线程CPU可以去处理了。当CPU去处理这个线程的时候,运行是`run`方法中的代码。明白以后可以看下面的几个构造线程的方式。 ## 第一种方式:通过Thread无参构造,构造一个什么也不干的线程 ## public static void main(String[] args){ // 创建一个线程对象 Thread t = new Thread(); // 调用start方法启动线程,让线程加入CPU处理队列中,并不是立马执行 t.start(); } 这样子就创建并且启动了一个线程,但这个线程什么也没干。我们可以查看Thread的源代码,看看里头的run方法实现。如下: /* What will be run. */ private Runnable target; @Override public void run() { if (target != null) { target.run(); } } 默认情况下,target为null,当我们没有覆盖Thread的run方法并且也没有给target赋值时,就是一个什么也不干的线程。 ## 第二种方式:通过Thread(Runnable)构造一个“能做事”的线程 ## public static void main(String[] args){ Thread t = new Thread(new Runnable(){ public void run(){ System.out.println("Thread t"); } }); t.start(); System.out.println("Thread main"); } 这样子也创建了一个线程并且启动了。我们创建了一个Runnable接口匿名实现类,通过`Thread(Runnable)`构造,给Thread对象的target属性赋值。main方法执行后,结果有两种情况。 Case 1: > Thread main > Thread t Case 2: > Thread t > Thread main 大部分情况肯定是第一种。为什么?后期写博文描述 ## 第三种方式:通过继承Thread类,统一对业务进行处理 ## 1、编写一个类,继承Thread类。这里假设为[《Java多线程 - 为什么使用多线程?》][Java_ -]提到的拍卖场景中的“创建出价记录”线程 public class CreateRecordThread extends Thread{ // 覆盖run方法 @Override public void run(){ // 业务代码,省略 } } 2、在主线程中创建CreateRecordThread对象并启动 public static void main(String[] args){ Thread t = new CreateRecordThread(); t.start(); } 为什么要这么写?通过第二种方式不是也可以做到吗?原因是如果我们有一个业务需要多次开启线程去处理,为了很好的维护我们只写一套代码。`这种方式则可以直接将业务代码写入线程类,我们只需要创建业务相关的线程对象并start即可`。当然如果只是某一个地方需要用到,完全可以采用第二种方式去做。 ## 第四种方式:新增业务处理类实现Runnable接口,将业务和线程分离 ## 1、编写一个类,实现Runnable接口 public class CreateRecordRunnable implements Runnable{ public void run(){ // 业务代码,省略 } } 2、创建线程,运行业务代码 public static void main(String[] args){ Runnable crt = new CreateRecordRunnable(); Thread t = new Thread(crt); t.start(); } 这么写和第三种写法有什么区别?相对第三种有什么优势? ##### 个人建议(仅供参考) ##### 区别就不说了,一个是类一个是接口,扩展方式不一样。但都可以方便的进行扩展。创建出来的对象也不一样,一个是`线程类`,一个是`业务类`。 “优势”,其实不能说`Runnable`相对`Thread`有什么“优势”,但我们从代码的合理性去思考。假设我们有一大堆的业务需要开启一个或者多个线程去做,我们可以继承Thread,把业务方法写在run里头。如果代码量很大,我们可以`编写多个private方法在run方法中调用`,也可以`新建一个父类继承Thread,提供通用方法给子类调用`。我们可以知道,我们的业务处理类,居然是一个线程类。比如说发送邮件的类,比如说发送短信的类,这些类成为了一个线程对象,这并不合理,我们的业务处理对象为什么是一个线程类?我们更希望这些业务处理类是`“一个可以被多线程运行的类”`,而非本身就是一个线程。所以,本人总结也仅限本人总结:**如果你要用继承Thread的方式,那么还是改为用实现Runnable的方式吧,这样对象的划分会合情合理一些。** (完) [Java_ -]: https://blog.csdn.net/u012627861/article/details/82904597
相关 多线程实践:如何在Java中实现一个线程池? 在Java中,我们可以使用`ExecutorService`和`ThreadPoolExecutor`类来创建和管理线程池。 以下是一个简单的例子,展示了如何创建一个固定大小 叁歲伎倆/ 2024年09月11日 09:42/ 0 赞/ 23 阅读
相关 Java多线程编程:如何创建并启动一个新线程? 在Java中,你可以通过继承Thread类或者实现Runnable接口来创建新的线程。以下是一个简单的例子: 1. 继承Thread类: ```java class MyTh 短命女/ 2024年09月04日 10:09/ 0 赞/ 16 阅读
相关 【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池? ![在这里插入图片描述][8d8e0d8a542946af858489a536162608.gif_pic_center] > 个人简介:Java领域新星创作者;阿里云技术博 青旅半醒/ 2024年02月20日 08:20/ 0 赞/ 23 阅读
相关 Java多线程之如何停止一个线程? 1 如何停止一个线程? 答:(1)不能简单的停止(Stop())一个线程。因为停止stop()会直接把线程停止,这样就没有给线程足够的时间来处理想要在停止前保存数据的逻辑 落日映苍穹つ/ 2022年12月24日 15:58/ 0 赞/ 117 阅读
相关 Java多线程 停止线程遇到线程阻塞如何处理? 文章目录 线程可能被阻塞 如果线程在每次迭代时都阻塞 线程可能被阻塞 子线程sleep的过程中, 给出中断信 小灰灰/ 2022年11月28日 13:40/ 0 赞/ 125 阅读
相关 Java 线程概述,线程的构造 引入线程旨在实现并发程序设计。 实际上,并发是一般性,顺序性才是特例。 “并发”与“并行”: 并发:在同一时间段内同时执行,逻辑上具备多台处理机。 本是古典 何须时尚/ 2022年11月20日 02:58/ 0 赞/ 127 阅读
相关 Java多线程 - 如何构造一个线程? 首先要明白`start`和`run`这两个方法。`start`方法意为启动一个线程,并不是立马执行这个线程,而是表示这个线程CPU可以去处理了。当CPU去处理这个线程的时候,运 小灰灰/ 2022年05月09日 03:08/ 0 赞/ 227 阅读
相关 Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程 下面将依次介绍: 1. 线程状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor 小鱼儿/ 2021年09月30日 13:54/ 0 赞/ 366 阅读
相关 java 多线程学习(一) 多线程的构造 进程和线程的理解: 进程:从狭义的角度来讲,进程就是一个正在运行的程序的实例。 线程:指的是进程中单一顺序的执行流,有时候也叫作轻量级进程。 举个例子: 偏执的太偏执、/ 2021年09月15日 23:16/ 0 赞/ 379 阅读
还没有评论,来说两句吧...