zoukankan      html  css  js  c++  java
  • java 多线程:Thread类;Runnable接口

    1,进程和线程的基本概念:

    1.什么是进程:
    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。(百度百科)
    进程其实就是我们计算机上正在运行的程序。
     
    2.什么是线程:
    线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
     
    3.什么是多线程:
    (1),概念:通俗的来说,多线程就是指多个线程并发执行的情况。
    (2),原理:
    多线程是如何做到的:
    CPU把一段时间划分为多个很小的时间片段,然后让每个线程获得这些片段的执行权限,由于CPU的速度非常快,所以给人的感觉就像是同时运行一样。现在的计算机,的确是可以做到同时运行的,为什么呢?因为现在的计算机大多数都是多核的。
     

    2、java中多线程的使用:Thread

    构造:

    • new Thread()

    启动一个新的线程:

    • .start()

    常用方法:

    • Thread.currentThread().getName() //获取当前线程的名字
    /**
     * @ClassName MyThreadExample
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/19.
     */
    public class MyThreadExample {
        private static class MyFirstThread extends Thread{
            //自己写个线程,重写run()方法
            @Override
            public void run() {
                System.out.println("MyFirstThread运行中:名字是:" + Thread.currentThread().getName());
            }
        }
        public static void main(String[] args) {
            MyFirstThread myFirstThread = new MyFirstThread();
            myFirstThread.run();//在当前线程中调用run()方法;不会产生新的线程
            myFirstThread.start();
            System.out.println("main方法中运行的线程名字:" + Thread.currentThread().getName());
            /**
             * 运行输出:
             * main方法中运行的线程名字:main
             * MyFirstThread运行中:名字是:Thread-0
             */
        }
    }
    线程运行具有随机性:

     可以看出每次运行顺序不一样

    线程的运行具有随机性。为什么是这样?那我们来讲讲调用了start()方法之后,产生了什么:
    • (1),调用start()之后,程序会通知我们的JVM,告诉jvm我已经准备好了,可以运行了。
    • (2),Jvm异步的调用我们的线程对应的run()方法。
    • (3),Jvm什么时候运行我们的run()方法,这个是程序员没法控制的(其实呢,还是可以相对的控制,这个之后讲,但是,你要做到绝对的控制它马上运行,还是不行)
    • (4),start()方法的调用顺序,不代表线程的run()方法的运行顺序。

    3、Thread实现了Runnable接口,通过实现Runnable接口的方式来实现一个线程

     Thread 类实现了Runnable接口,该接口只有有一个抽象方法run()

      Thread 类构造方法可以传入一个Runnable接口实现类来构造线程实例:

     示例代码:

    /**
     * @ClassName UseRunnableThread
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/19.
     */
    public class UseRunnableThread {
        private static class MyRunnableThread implements Runnable {
    
            @Override
            public void run() {
                System.out.println("MyRunnableThread" + Thread.currentThread().getName());
            }
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(new MyRunnableThread());
            //lambda 表达式方式构造线程方法
            Thread thread1 = new Thread(()->System.out.println("Lambda表达式构建的线程,匿名内部类对象:" + Thread.currentThread().getName()) );
            thread.start();
            thread1.start();
            System.out.println("main方法运行的线程:" + Thread.currentThread().getName());
            /**
             * 运行输出:
             * Lambda表达式构建的线程,匿名内部类对象:Thread-1
             * MyRunnableThreadThread-0
             * main方法运行的线程:main
             */
        }
    }
     
     
     
  • 相关阅读:
    redis持久化RDB和AOF
    线程同步的几种方法
    JRE和JDK的区别
    Spring-两种配置容器
    为什么String类是不可变的?
    Oracle 每五千条执行一次的sql语句
    Executor , ExecutorService 和 Executors
    常见框架单例、多例与线程安全性总结
    mysql 的S 锁和X锁的区别
    linux下使用shell脚本自动化部署项目
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14677429.html
Copyright © 2011-2022 走看看