zoukankan      html  css  js  c++  java
  • 02_线程的创建和启动_继承Thread方式

    【简述】

    java使用Thread类代表线程,所有的线程都必须是Thread或者其子类的实例。

    每个线程的任务就是完成一定的任务,实际上就是执行一段程序流。

    【创建并启动多线程的步骤(集成Thread类方式)】

    1.定义继承Thread类的子类,重写run方法:run()方法就代表了线程需要完成的任务,故run()方法称为:线程执行体。

    2.创建线程对象:即创建Thread子类的实例。

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

    【示例代码FirstThread.java】

    package com.Higgin.part01;
    
    //1.1定义继承Thread类的子类FirstThread
    class FirstThread extends Thread{
        //1.2重写run方法
        public void run(){
            for(int i=0;i<10;i++){
                //注意:当线程继承Thread类时,直接使用this.getName()即可获得当前线程的名字
                System.out.println(this.getName()+"===="+i);
            }
        }
    }
    
    
    public class Demo1{
    
        public static void main(String[] args) {
            //2.创建线程对象
            FirstThread t1=new FirstThread();
            //3.启动线程
            t1.start();
            //2.创建线程对象
            FirstThread t2=new FirstThread();
            //3.启动线程
            t2.start();
            
            for(int i=0;i<10;i++){
                //调用Thread.currentThrad().getName()可获得当前线程的名字
                System.out.println(Thread.currentThread().getName()+"===="+i);
            }
        }
    }

     【注意!!!】

    启动线程使用 start()方法,不是run()方法!!永远不要调用线程对象的run()方法!!!

    调用start()方法,系统会把run()方法当成线程执行体来处理。

    直接调用run()方法,则run()方法会立即被执行,系统会把线程对象当成一个普通对象来处理,run()方法也变成了一个普通的方法

     另外,直接调用线程对象的run()方法,则run()方法内不能通过getName()来获得当前执行线程的名字,而是需要使用Thread.currentThread先获得当前线程,再调用线程的getName()方法来获得线程的名字。

    另外,调用了线程的run()方法之后,该线程已经不再处于新建状态,不要再次调用线程对象的start()方法,只能对处于新建状态的线程调用start()方法,否则会引发IllegalThreadStateException异常。

    【运行结果】

    【注意一:主线程勿忘】

     java程序开始运行时,程序至少会创建一个主线程,不要忘记了,本例中的main()方法的方法体就是主线程的线程执行体。

    【注意二:两个读取线程名字的方法的区别】

    1. Thread.currentThread():currentThread()是Thread类的静态方法,该方法是获取当前正在执行的线程的线程对象

    2.getName():该方法是Thread类的实例方法,该方法返回调用该方法的线程的名字

    【注意三:关于线程名字】

    1.默认情况下,主线程的名字是main,用户启动的线程名字依次是:Thread-0、Thread-1......

    2.当然,可以通过setName(String name)来设置对应的线程的名字。

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5901544.html
Copyright © 2011-2022 走看看