自学内容网 自学内容网

【Java EE初阶 ---多线程(初阶)】多线程的使用

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

前言

上篇博客,大概说明了计算机的历史和进程这一概念,初步对计算机的组成和运行有一定了解。这篇博客将正式进入对多线程的学习,希望对大家有所帮助~ ~ ~

认识线程

线程它和进程有什么关系吗?仅仅是一字之差吗?

线程的概念⼀个线程就是⼀个"执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间"同时"执⾏着多份代码.
相当于一个大任务被分解为多个小任务,其中分别完成各个小任务的人就是线程。他们都是为了完成同一个大任务去努力,这种情况就是多线程!

当然不是,首先进程是包含线程的,每个进程都至少有一个线程存在,即主线程其次进程和进程之间不共享内存空间,但是同一个进程的线程之间共享一个内存空间

在这里插入图片描述

总结:
· 进程是系统资源分配的最小单位,线程是系统调度的最小单位
· ⼀个进程挂了⼀般不会影响到其他进程. 但是⼀个线程挂了,可能把同进程内的其他线程⼀起带⾛(整个进程崩溃)

为什么要有线程?

因为随着计算机被要求处理的计算越来越多且复杂,计算机不断发展尽力提高算力。众所周知,计算机的核心是CPU,但是单核CPU发展到了瓶颈,于是多核CPU就横空出世。为了更好的利用多核优势,有大佬就提出了 “ 并发 ” 概念。
目前," 并发编程 “成为” 刚需 ",从某种角度来讲,并发编程大大提高了计算机运行的效率。
对于并发的理解大家可以去看上篇博客有详细说明。

虽然多进程也能实现并发编程,但是线程⽐进程更轻量.

• 创建线程 ⽐ 创建进程 更快.
• 销毁线程 ⽐ 销毁进程 更快.
• 调度线程 ⽐ 调度进程 更快.

当然,也有更高效的方法,我们以后再说…

Java的线程 和 操作系统的线程的关系

明确一个点,线程是操作系统中的概念

操作系统内核实现了线程这样的机制,并且对⽤⼾层提供了⼀些 API 供⽤⼾使⽤
Java标准库中 Thread 类可以视为是对操作系统提供的 API 进⾏了进⼀步的抽象和封装。
简单理解,操作系统把它内部的一个方法拿出来当作接口,去给其他用户使用,而Java中就对于把这个接口拿过来使用这个方法,并且做了一些改变。
大家如果对 API 这个概念不清楚,把它当作一个接口就行,如果需要更专业的理解,可以看看这篇博客什么是API?

如何创建线程

继承 Thread 类创建线程

继承Thread ,重写run

class MyThread extends Thread{
    //相当于线程的入口
    @Override
    public void run() {
        while (true) {
            System.out.println("hello thread");
            //通过类名调用, 是静态方法
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

public class Demo1 {
    public static void main(String[] args) {
        Thread t = new MyThread();
        //真正在系统中创建出一个线程
        t.start();//相当于多了一个执行流,可以一心两用
        
        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

sleep是静态方法,让CPU休眠,时间到了之后再运行,同时去处理异常

实现Runnable接口创建线程

使用Runnable接口,重写run

class MyRunnable implements Runnable{
    @Override
    public void run() {
        while(true){
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        //好处是:高内聚,低耦合
        Runnable runnable=new MyRunnable();
        //创建 Thread 类实例,调⽤ Thread 的构造⽅法时将 Runnable 对象作为目标参数.
        Thread t=new Thread(runnable);//给Thread传参数进去
        t.start();
        
        //主线程
        while(true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

匿名内部类创建线程

Java中方法必须基于类来存在,使用匿名内部类就可以少定义一些类了。

匿名内部类创建 Thread ⼦类对象

public class demo3 {
    public static void main(String[] args) {
        //匿名内部类
        Thread t=new Thread(){
            //属性
            private int n;

            //方法重写
            @Override
            public void run(){
                while(true){
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };


        t.start();
        while(true){
            System.out.println("hello main");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

匿名内部类创建 Runnable ⼦类对象

public class Demo4 {
    public static void main(String[] args) throws InterruptedException {
        //使用Runnable,任务和线程概念是分离的
        Runnable runnable=new Runnable(){
            @Override
            public void run() {
                while(true){
                    System.out.println("hello thread");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        
        Thread t=new Thread(runnable);//创建Thread实例
        t.start();
        while(true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

lambda 表达式创建 Thread ⼦类对象(函数式接口)

public class Demo5 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
           while(true){
               System.out.println("hello thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        }) ;
        t.start();

        while(true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

完结

如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散 ~ ~ ~


原文地址:https://blog.csdn.net/optimistic_chen/article/details/143836174

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!