8_2、Java基本语法之多线程的两种创建方式(jdk5之前)

news2024/11/15 19:42:40

一、前言

        Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread 类来体现。

二、JDK1.5之前创建新执行线程有两种方法

        继承Thread类的方式

        实现Runnable接口的方式

三、继承Thread类的方式

1、使用继承Thread类的方式创建一个线程:

    ①.创建一个子类,继承于Thread线程类。
    ②.重写Thread类中的run()方法。-->将此线程执行的操作写在这里
    ③.创建一个子类的实例化对象。
    ④.使用此对象调用start()方法。

/*  
     输出100以内的偶数


 */
//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 TreadTest {
    public static void main(String[] args) {
        //3.创建一个子类的实例化对象。
        MyThread test1 = new MyThread();
        //4.使用此对象调用start()方法。①启动当前线程 ②调用当前线程的run()方法。
        test1.start();
        //我们不能通过直接调用run()方法的方式开启线程
//          test1.run();
        //不能再次使用test调用start方法,否则会报异常:IllegalThreadStateException
//        test1.start();

        //我们需要建立新的线程的对象,再开启线程调start()方法
        MyThread test2 = new MyThread();
        test2.start();

        //以下操作都是main线程进行执行
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName()+":" +i+"********main()************");
            }
        }
    }
}

2、Thread类中的常用方法:

①.start():启动当前线程,并且调用run()。
②.run():通常需要重写此方法,将创建的线程要操作的代码写进此方法。
③.getName():获取线程名称
④.setNmae():设置线程名称
⑤.currentThread():静态方法,返回执行当前代码的线程。
⑥.yield():释放当前cpu的执行权,但其后也有可能继续被cpu进行执行处理当前线程。
⑦.join():在线程a中调用线程b的join()方法,此时线程a会进入阻塞状态,先将线程b全部执行结束线程a才会停止阻塞状态。
⑧.stop():已过时。表示结束当前线程。
⑨.sleep(long millitimes):让当前线程进入“睡眠”millitimes毫秒,在millitimes毫秒内,当前线程是阻塞状态。
⑩.isAlive():判断当前线程是否执行结束。
 
 11.线程的优先级:
      MIN_PRIORITY = 1;
      MAX_PRIORITY=10;
      NORM_PRIORITY = 5;

如何获取和设置线程的优先级?
      获取当前线程的优先级:getPriority()
      设置当前线程的优先级:setPriority(int p)
      说明:高优先级的线程要抢占低优先级的线程CPU的执行权。但是这并不意味着高优先级的线程运行结束,低优先级的线程才能执行,只是从概率上讲。

class HelloThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i % 2 == 0){

//                try {
//                    sleep(10);
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }

                System.out.println(Thread.currentThread().getName() +  ":" + getPriority() +  ":" + i);
            }
            if(i % 20 == 0){
                yield();
            }
        }
    }

    public HelloThread(String name) {
        super(name);
    }
}


public class ThreadMethodTest {
    public static void main(String[] args) {
        HelloThread h1 = new HelloThread("Thread:1");
//        h1.setName("线程一");
        h1.start();
        h1.setPriority(Thread.MAX_PRIORITY);
        //主线程操作
        Thread.currentThread().setName("主线程");
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        for (int i = 0; i < 100; i++) {
            if(i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ":" +Thread.currentThread().getPriority() +  ":" + i);
            }
//            if(i == 20){
//                try {
//                    h1.join();
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
//            }
        }

//        System.out.println(h1.isAlive());

    }
}

四、实现了Runnable接口的方式

1、使用实现Runnable接口的实现类的方式创建一个线程:

①.创建一个实现了Runnable接口的实现类。
②.重写Runnable接口中的抽象方法run()。
③.实例化一个实现类的对象。并将这个实现类的对象当做参数传给Thread类的构造器形参。
④.创建一个Thread的对象。
⑤.Thread实例化对象调用start()。
//1.创建一个实现了Runnable接口的实现类。
class MThread 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);
            }
        }
    }
}


public class ThreadTest1 {
    public static void main(String[] args) {
        //3.实例化一个实现类的对象。
        MThread mThread = new MThread();
        //4.创建一个Thread的对象。并将这个实现类的对象当做参数传给Thread类的构造器形参。
        Thread thread1 = new Thread(mThread);
        Thread thread2 = new Thread(mThread);

        thread1.setName("线程1");
        thread2.setName("线程2");

        thread1.start();
        thread2.start();
    }
}

五、比较两种创建线程的方式

        1、开发中,更多地使用实现Runnable接口的方式创建线程。

                原因:①.实现接口的方式打破了Java的单继承的局限性。

                           ②.实现Runnable接口的方式天然的处理了多个线程数据共享的问题。

        2、两者的联系:观察Thread类源码我们发现,Thread类已实现了Runnable接口。

                

        3、相同点:两者都要重写run(),将线程要处理的逻辑写进run()中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++17可变参函数模板详解

c语言中对于 可变参数的处理是用va_list等一系列宏去做的 他只会生成一个函数 但是理解起来非常麻烦 因为你不得不去了解很多关于汇编层面栈帧的知识 c对于可变参数函数模板进行了改进 他会生成多个函数 而不是在一个函数里玩 个人觉得c这种方式更加先进而且更好理解 接下来让…

线性代数的本质

注&#xff1a;目前没有精力去美化排版&#xff0c;所有博客仅作为自己学习记录所用 《线性代数的本质》课程链接&#xff08;bilibili&#xff09; 目录&#xff1a; P1-P4的内容&#xff1a; 1.线性代数的加法&#xff1a;为什么这样子来定义呢&#xff08;如图&#xff…

(附源码)SSM人力资源管理系统 毕业设计 271621

SSM人力资源管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#…

Servlet(二):Servlet的运行原理HttpServlet、HttpServletRequest、HttpServletResponse类详解

Servlet运行原理Servlet API详解HttpServlet类HttpServletRequest类HttpServletResponse类Servlet API详解 Servlet API中包含了很多的内容&#xff0c;但我们主要用到的是以下三个类&#xff0c;HttpServlet&#xff0c;HttpServletRequest&#xff0c;HttpServletResponse …

2022-04-10-Docker

layout: post #标题配置 title: Docker #时间配置 date: 2022-04-10 22:50:00 0800 #目录配置 categories: Docker #标签配置 tag: 学习笔记 content {:toc} Docker 1.初识 Docker 1.1 docker概念 我们写的代码会接触到好几个环境&#xff1a;开发环境、测试环境以及生产环…

祖师爷香农,到底有多神?

1916年&#xff0c;第一次世界大战激战正酣。在这一年的4月30日&#xff0c;远离战场的美国密歇根州佩托斯基&#xff08;Petoskey&#xff09;&#xff0c;一个男婴呱呱坠地。这个男婴&#xff0c;就是我们这篇文章的主角——香农。香农的全名&#xff0c;叫做克劳德艾尔伍德香…

Alvas.Audio专门为C#和VB.Net程序员设计

Alvas.Audio专门为C#和VB.Net程序员设计 Alvas.Audio库使C#和VB.Net程序员能够创建执行(包括混合声音信息)、捕获、转换和编辑音频的应用程序。 Alvas.Audio音频是C#音乐库。Web程序员。 这使您能够生产。NET程序&#xff0c;例如Winforms/WPF/Windows服务/控制台录音机、Inter…

steam搬砖项目,新手也能月入8000+(详细教程)

大家好&#xff0c;我是阿阳 这个项目很早之前就有了&#xff0c;而且这么久以来一直非常稳定。 作为一名没有任何经验却想通过低成本投入来赚钱的小白&#xff0c;做steam搬砖项目真的可以实现财富自由 0成本&#xff0c;操作简单&#xff0c;有手机就能做&#xff01;真的…

【Golang】欲入此Go先看Go的基本语法

&#x1f4d3;推荐网站(不断完善中)&#xff1a;个人博客 &#x1f4cc;个人主页&#xff1a;个人主页 &#x1f449;相关专栏&#xff1a;CSDN专栏、个人专栏 &#x1f3dd;立志赚钱&#xff0c;干活想躺&#xff0c;瞎分享的摸鱼工程师一枚 &#x1f34a;前言 完成了我们众多…

OpenAI 最强对话模型 ChatGPT 注册使用笔记

2022年12月5日OpenAI 发布了对话语言模型 ChatGPT&#xff0c;并开放了免费试用。ChatGPT 是一款基于GPT3模型的聊天机器人&#xff0c;该聊天机器人可以在模仿人类说话风格的同时回答大量的问题。在现实世界之中&#xff0c;例如数字营销、线上内容创作、回答客户服务查询&…

Python使用Opencv图像处理方法完成手势识别(一)

Opencv完成手势识别HSV的提取特征提取轮廓绘制完整代码由于是使用Opencv完成手势识别&#xff0c;所以首先利用颜色特征是对手的颜色进行提取&#xff0c;获得HSV的最小值与最大值。HSV的提取 HSV颜色空间阈值主要是靠Trackbar调节阈值和cv2.inRange来生成掩膜来提取。 这是我…

外汇天眼:外汇市场上不得不说的两大类庄家!

前一阵子&#xff0c;天眼君跟好友讨论外汇市场上有没有庄家&#xff0c;今天天眼君就跟大家探讨下这个问题。我们都知道股票交易中是有所谓的庄家的&#xff0c;散户必须要猜测庄家的做法&#xff0c;否则很有可能变成待割的韭菜。 而我们常见的对外宣传中&#xff0c;基本上…

R语言对推特twitter数据进行文本情感分析

原文链接&#xff1a;http://tecdat.cn/?p4012我们以R语言抓取的推特数据为例&#xff0c;对数据进行文本挖掘&#xff0c;进一步进行情感分析&#xff0c;从而得到很多有趣的信息&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。找到推特来源是苹果手机或者安…

C++ Reference: Standard C++ Library reference: Containers: list: list: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/assign/ 公有成员函数 <list> std::list::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void assign (…

字符串处理【AC自动机】 - 原理 AC自动机详解

字符串处理【AC自动机】 - 原理 AC自动机详解 AC自动机&#xff08;Aho-Corasick automaton&#xff09;在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法。 学习AC自动机&#xff0c;要有KMP和Trie&#xff08;字典树&#xff09;的基础知识。 KMP是单模匹配算法&a…

三代全长16s助攻,轻松搞定水体研究领域10+文章

基于PacBio三代测序平台&#xff0c;可高效获得16s rRNA全长序列&#xff0c;同时不必纠结引物选择带来的结果偏差&#xff0c;令物种分类更多更精准——到达“种”水平。Pacbio平台同时兼具时间短&#xff0c;无需扩增等优势&#xff0c;伴随着三代测序成本的下降&#xff0c;…

<VSCode下载、安装、配置以及连接云服务器进行Linux开发>

目录 1.下载、安装VSCode 2.配置环境及插件 2.1 实用插件安装 2.1.1 中文汉化插件 2.1.2 Remote-ssh插件​ 连接远程云服务器&#xff1a; 远程云服务器开发&#xff1a; Xshell界面与VSCode界面对比&#xff1a; 2.1.3 C/C Extension Pack&#xff08;C/C扩展包&#xff0…

Java实现后端跨域的常见解决方式

目录一、搭建服务&#xff08;cross-server&#xff09;1.1、maven依赖1.2、接口1.3、配置二、搭建服务&#xff08;cross-web&#xff09;2.1、maven依赖2.2、接口2.3、页面2.4、配置2.5、跨域请求结果2.6、常见跨域情况三、解决方案3.1、通过 CrossOrigin 注解3.2、通过配置类…

Kafka高级特性解析之主题

1、管理 使用kafka-topics.sh脚本&#xff1a; 选项说明--config <String: namevalue>为创建的或修改的主题指定配置信息。支持下述配置条目&#xff1a; cleanup.policycompression.typedelete.retention.msfile.delete.delay.msflush.messagesflush.msfollower.repli…

不影响1,4丁炔二醇(BYD)的情况下去除铜离子的工艺

1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产品、维生素B6的主要原料&#xff0c;还可以用于镀镍的增亮剂、防腐抑制剂等领域。 1,4&#xff0d;丁二醇&#xff08;BDO&#xff09;是一种…