• Java——多线程


    
    /*

     * 进程: 正在 进行中的程序

     * 线程:就是进程中一个负责程序执行的控制单元(执行路径)

     * 一个进程中可以有多个执行路径,称之为多线程。

     * 

     * 一个进程中至少要有一个线程。

     * 

     * 开启多个线程是为了同时运行多部分代码。

     * 

     * 每一个线程都有自己运行的内容,这个内容可以成为线程要执行的任务。

     * 

    第一种方法***********************************************

     * 创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。

     * 

     * 步骤:

     * 1.定义一个类继承Thread类。

     * 2.覆盖Thread类中的run方法。

     * 3.创建线程对象。

     * 4.开启线程  (即调用  Thread的start()方法)

     * 

     */

    public class ThreadTest

    {

    public static void main(String[] args)

    {

    /*

     * 创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。

     * 而运行的指定代码就是这个执行路径的任务。

     * jvm创建的主线程的任务都是定义在 了主函数中。

     * 

     * 而自定义的线程的任务。。。  Thread类用于描述线程,线程是需要任务的。所以Thread类也是任务的描述。

     * 这个任务就是通过Thread类中的run方法来体现 的。也就是说。run方法 就是封装自定义线程运行任务的函数。

     * 

     * run方法中定义的就是线程中要运行的任务代码。

     * 

     * 开启线程是为了 运行 指定的代码,所以只有继承 Thread类,并重写run方法。

     * 将运行的代码 定义在run方法中即可。。。。。。。

     */

    //第三步:   创建线程类

    Demo d1 = new Demo("杨超");

    Demo d2 = new Demo("刘媛");

    //第四步:   开启线程

    d1.start();

    d2.start();

    }

    }

    //第一步 :   定义一个类继承Thread类

    class Demo extends Thread

    {

        private String name;

    Demo(String name)

    {

        this.name = name;

    }

    //第二步  : 覆盖Thread类中的run方法。

    public void run()

    {

    for(int i=0; i<10; i++)

    {

        System.out.println(name+"....i="+i );

    }

    }

    }

    多线程的运行图解


    第二种方法**************************************************

    /*

     * 创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。

     * 然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

     * 

     * 步骤:

     * 1.定义类实现Runnable接口。

     * 2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。

     * 3.通通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。

     *  为什么?因为线程的任务都封装在 Runnable接口子类的run方法中。

     *  所以要在线程对象创建时就必须明确要运行的任务。

     * 4.调用线程对象的start方法开启线程。

     * 

     * 实现Runnable接口的好处:

     * 1.将线程的任务从线程的子类中分离出来了。进行了单独的封装。

     *  按照面向对象的思想将任务封装成对象。

     * 2.避免了java单继承的局限性。

     * 所以 创建线程的第二种方式 即用实现接口的方法 较为常用。

     */

    public class ThreadTest2 

    {

    public static void main(String[] args)

    {

    // TODO Auto-generated method stub

    Dem d1 = new Dem();

    Thread t1 = new Thread(d1);

    t1.start();

    }

    }

    class Dem implements Runnable//准备扩展类的功能,让其内容可以作为线程的任务执行。

    //通过接口的形式完成。

    {

    @Override

    public void run()

    {

    // TODO Auto-generated method stub

    say();

    }

    public void say()

    {

        System.out.println();

    }

    }




    Java中Thread类的start()和run()的区别

    1、start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。 

    通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后JVM通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程执行体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止,而CPU再运行其它线程, 

    2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。 

    如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程,只有这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。 


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Go语言学习之1 基本概念、环境搭建、第一个Go程序
    go环境搭建
    go 圣经阅读笔记之-入门
    RabbitMQ
    图片选择并使用base64展示
    关于c# hashtable的一个注意点
    js image to base64 摘录
    linq to sql 获取sql与参数添加到日志中
    时钟的实现
    无限级菜单的实现
  • 原文地址:https://www.cnblogs.com/blogs-chao/p/4764914.html
Copyright © 2020-2023  润新知