多线程概念,以及多线程的实现

package com.shujia.day19;

/*
    多线程:
        进程:
            正在运行的程序,是系统进行资源分配和调用的独立单位。
            每一个进程都有它自己的内存空间和系统资源。
            理解:一个正在运行的软件
        线程:
            是进程中的单个顺序控制流,是一条执行路径
            一个进程如果只有一条执行路径,则称为单线程程序。
            一个进程如果有多条执行路径,则称为多线程程序。
            举例:阿里云盘(进程)中多个同时进行的任务,每一个任务可以看作一个线程

    1、如何创建一个线程对象呢?
        a. 自定义线程类继承Thread类,重写run方法
        b. 自定义线程类实现Runnable接口,实现run方法

    2、如何启动一个线程呢?
        调用start()方法启动

    Thread无参构造方法
        Thread() 分配一个新的 Thread对象。


    注意:
        1、启动一个线程的时候,若直接调用run方法,仅仅是普通的对象调用方法,按照自上而下的顺序执行,底层不会额外的创建一个线程再执行
        2、从执行的结果上来看,java线程之间是抢占式执行的,谁先抢到cpu执行权谁就先执行
        3、每次运行的结果顺序不可预测的,完全随机的
        4、每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。

    Thread类中的成员方法:
        1、public final String getName()  获取线程对象的名字,默认是通过调用Thread无参构造方法获取的名字,从0开始
        2、设置线程对象名字的方式:
            a. 通过父类的有参构造方法,在创建线程对象的时候设置名字
            b. 线程对象调用setName(String name)方法,给线程对象设置名字
        3、获取线程的等级
            getPriority() 默认优先级都是5
        4、设置线程优先级,setPriority(int i),在启动之前设置  [1,10]
            注意不是优先级高的一定先执行,只是可能性变高了。

Java程序运行原理
    java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。所以 main方法运行在主线程中。在此之前的所有程序都是单线程的。

思考:
  jvm虚拟机的启动是单线程的还是多线程的?主线程 垃圾回收线程


 */

实现一

class MyThread1 extends Thread {
    MyThread1() {
    }


    //public Thread(String name)
    MyThread1(String name) {
        super(name);
    }

//    MyThread1(){
//        //super()
//    }


    @Override
    public void run() {
        //将来线程启动后需要执行的逻辑
        for (int i = 1; i <= 200; i++) {
            System.out.println(this.getName() + " - Hello word " + i);
        }
    }
}

public class ThreadDemo1 {
    public static void main(String[] args) {
        //创建一个自己的线程对象
//        MyThread1 t1 = new MyThread1("徐思远"); // Thread-0
        MyThread1 t1 = new MyThread1();
        t1.setName("徐思远");
        t1.setPriority(1);
        System.out.println("t1: "+t1.getPriority());
        //创建一个自己的线程对象
//        MyThread1 t2 = new MyThread1("魏一民"); // Thread-1
        MyThread1 t2 = new MyThread1();
        t2.setName("民哥");
        t2.setPriority(10);
        System.out.println("t2: "+t2.getPriority());
//        t1.run();
//        t2.run();
        t1.start();
        t2.start();
    }
}

实现二(更推荐)

package com.shujia.day19;

public class MyRunnable1 implements Runnable{

    @Override
    public void run() {
        //线程要执行的逻辑
        for(int i=1;i<=200;i++){
            //获取当前的线程对象
            System.out.println(Thread.currentThread().getName() + " - "+i);//Thread.currentThread()获取当前调用的线程
        }
    }
}

class RunnableDemo1{
    public static void main(String[] args) {
        //创建类的对象
        MyRunnable1 myRunnable1 = new MyRunnable1();
        //借助Thread类构造方法,创建一个线程对象
        //Thread(Runnable target) 分配一个新的 Thread对象。
//        Thread t1 = new Thread(myRunnable1);
//        t1.setName("民哥");
//        Thread t2 = new Thread(myRunnable1);
//        t2.setName("陈少");
//        Thread t3 = new Thread(myRunnable1);
//        t3.setName("徐老祖");

        //Thread(Runnable target, String name) 分配一个新的 Thread对象。并设置名字
        Thread t1 = new Thread(myRunnable1,"民哥");
        Thread t2 = new Thread(myRunnable1,"陈少");
        Thread t3 = new Thread(myRunnable1,"徐老祖");
        t1.start();
        t2.start();
        t3.start();



    }
}
posted @ 2024-08-19 20:13  ていせい  阅读(1)  评论(0编辑  收藏  举报