• 多线程一(实现多线程的两种方式)


    Thread类:

    Thread是程序中的执行线程。java虚拟机允许应用程序并发地的运行多个执行线程。

     

    l  构造方法

    l  常用方法

    1.进程与线程的关系

    进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

    线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,

       这个应用程序也可以称之为多线程程序。

    简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程。

    2.多线程两种实现方式

    创建线程有两种方法

    l  一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。

    run方法相当于其他线程的main方法。

    l  另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。

    然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。

      2.1.创建线程方式一继承Thread类

    创建线程的步骤:

    1 定义一个类继承Thread

    2 重写run方法。

    3 创建子类对象,就是创建线程对象。

    4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。

        测试类
    public class Demo01 {
        public static void main(String[] args) {
            //创建自定义线程对象
            MyThread mt = new MyThread("新的线程!");
            //开启新线程
            mt.start();
            //在主方法中执行for循环
            for (int i = 0; i < 10; i++) {
                System.out.println("main线程!"+i);
            }
        }
    }
        自定义线程类
    public class MyThread extends Thread {
        //定义指定线程名称的构造方法
        public MyThread(String name) {
            //调用父类的String参数的构造方法,指定线程的名称
            super(name);
        }
        /**
         * 重写run方法,完成该线程执行的逻辑
         */
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(getName()+":正在执行!"+i);
            }
        }
    }

      2.2.创建线程方式—实现Runnable接口

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

    该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。

      1、定义类实现Runnable接口。

    2、覆盖接口中的run方法。。

    3、创建Thread类的对象

    4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

    5、调用Thread类的start方法开启线程。

        代码演示:
    public class Demo02 {
        public static void main(String[] args) {
            //创建线程执行目标类对象
            Runnable runn = new MyRunnable();
            //将Runnable接口的子类对象作为参数传递给Thread类的构造函数
            Thread thread = new Thread(runn);
            Thread thread2 = new Thread(runn);
            //开启线程
            thread.start();
            thread2.start();
            for (int i = 0; i < 10; i++) {
                System.out.println("main线程:正在执行!"+i);
            }
        }
    }
        自定义线程执行任务类
    public class MyRunnable implements Runnable{
    
        //定义线程要执行的run方法逻辑
        @Override
        public void run() {
            
            for (int i = 0; i < 10; i++) {
                System.out.println("我的线程:正在执行!"+i);
            }
        }
    }

    3.多线程两种实现方式的区别

    第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,

    一部分线程对象,一部分线程任务。继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,

    有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。

    4.线程的匿名内部类使用

      l  方式1:创建线程对象时,直接重写Thread类中的run方法

            new Thread() {
                public void run() {
                    for (int x = 0; x < 40; x++) {
                        System.out.println(Thread.currentThread().getName()
                                + "...X...." + x);
                    }
                }
            }.start();

    l  方式2:使用匿名内部类的方式实现Runnable接口,重新Runnable接口中的run方法

    Runnable r = new Runnable() {
                public void run() {
                    for (int x = 0; x < 40; x++) {
                        System.out.println(Thread.currentThread().getName()
                                + "...Y...." + x);
                    }
                }
            };
            new Thread(r).start();


  • 相关阅读:
    可变参数模板的递归解析
    在Ubuntu上安装多个版本的g++ 并进行默认版本切换
    不错的威盾PHP加密专家解密算法
    文章相关性分析详细介绍
    c#连接mysql中文乱码解决方案(MySql.Data.dll)
    firefox用12306Helper 0.2结合ie tab+自动订火车票和完成支付全攻略
    Nutch命令大全
    Jtable利用SetModel进行数据绑定
    在php中使用CKEDITOR在线编辑器
    Nutch1.2搜索引擎使用详解
  • 原文地址:https://www.cnblogs.com/lixiangyang521/p/7920607.html
Copyright © 2020-2023  润新知