复习并发编程的基础知识(一)

这篇具有很好参考价值的文章主要介绍了复习并发编程的基础知识(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

进程和线程

并发和并行

 如何创建一个线程?

1,继承Thread类

 2,实现Runnable接口

         3. Callable<>接口

线程Thread类的一些重要方法

 守护线程:


时间长了,并发编程的基础知识总忘,来记录一下:

进程和线程

进程:资源分配的最小单元,什么是资源?CPU,内存,网卡等等

线程:进程中的一个实体,不能单独存在,依赖进程存在。CPU调度的最小单元。

并发和并行

并发:单位时间内,多个任务交替执行。

复习并发编程的基础知识(一)

 并行:同一时刻,每个任务同时执行。多核CPU可以实现并行。

复习并发编程的基础知识(一)

 如何创建一个线程?

1,继承Thread类
package cn.tulingxueyuan.xiaoshanshan.base;

public class UseThread {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }

}

class MyThread extends Thread{
    @Override
    public void run() {
        //要执行的代码
        System.out.println("hello ,Thread");
    }
}
2,实现Runnable接口
package cn.tulingxueyuan.xiaoshanshan.base;

public class UseRunnable {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable); // Runnable接口也要借助Thread类才能启动
        thread.start();
    }

}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        // 要执行的代码
        System.out.println("hello ,Runnable");
    }
}

其实Thread类也实现了Runnable接口

复习并发编程的基础知识(一)

我们在启动一个java进程的时候,main()是主线程,在main()方法中又启动了子线程,当主线程运行结束了不意味着进程就结束了,所有线程结束了进程才结束。在main线程中启动一个子线程Thread-0,主线程不会因为有子线程的执行而阻塞,main线程和线程Thread-0会并行执行。也就是说子线程和主线程之前是异步执行的。

如下图程序中,当运行该程序的时候,控制台(Terminal中)输入jconsole,可以查看线程的情况,当main()方法执行完成之后会退出,Thread-0会继续执行。当Thread-0执行结束以后,会卡死或者断开。

package cn.tulingxueyuan.xiaoshanshan.base;

public class CatThreadDemo {


    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.start();
        for(int  i =0 ;i<60;i++){

            System.out.println(i +", 执行线程名"+Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }


}
class Cat extends Thread{

    int times = 0;

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        while(true){

            System.out.println("喵喵,我是一只小猫猫~" + (++times) + "线程名称:" + name);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(times == 80){

                break ;
            }
        }
    }
}

 复习并发编程的基础知识(一)

复习并发编程的基础知识(一)

3. Callable<>接口

(面试的时候如果问启动线程有几种方法,这种方式其实不能算是创建线程的方法,但是可以作为补充,详细看后面的内容)

Thread类的run方法和Runnable接口的run方法都是返回的空值,那么想得到一个线程的运行结果怎么办呢?

用Callable接口。

复习并发编程的基础知识(一)

 那这个结果怎么拿到呢?阻塞吗?那么线程异步又有什么用呢?为了解决这个问题。JDK又为我们提供了一个类——Future<>接口(优势JUC包中的类,看看JUC多么重要)

复习并发编程的基础知识(一)

 但是Future是个接口,我们主要用这个接口的get()方法,怎么用呢?我们每用一次就去实现一次吗?

不是的,JUC又为我们提供了一个FutureTask类

复习并发编程的基础知识(一)

复习并发编程的基础知识(一)

 Callable怎么传给Thread呢?没有这种方法啊!怎么办呢?将Callable包装成一个FutureTask执行

复习并发编程的基础知识(一)

FutureTask由于是Runnable的子类,可以交给Thread类启动了。

package cn.tulingxueyuan.xiaoshanshan.base;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());
        new Thread(futureTask).start();
        System.out.println(futureTask.get()); // get阻塞了

        System.out.println("主线程结束");
    }

    static class MyCallable implements Callable<Integer>{

        private int count ;

        @Override
        public Integer call() throws Exception {
            Thread.sleep(1000);
            for(int i = 0;i<100;i++){
                count ++ ;
            }
            System.out.println(Thread.currentThread().getName() + "线程结束,结果是:"+count);
            return count;
        }
    }
}

这里就有一个面试题:新启动一个线程有几种方式?答案:官方给出的是:两种。

根据Thread类写在源码上的注释,其实就两种:一种是继承Thread类,另外一种是实现Runnable接口。复习并发编程的基础知识(一)

线程Thread类的一些重要方法

start()方法:一个线程只有调用这个方法后,才能真正和操作系统的线程挂钩,

底层是调用了start0()方法,这个方法是native方法,即本地方法,底层是C或者C++实现的,是JVM来调用的,真正实现了多线程。

run()方法:这个方法中是要写的代码逻辑

setName()设置线程名称

getName()得到线程名称

sleep()睡眠,不会释放锁 Thread类调用的静态方法

interrupt()中断方法,不是终止方法

yiled()静态方法,礼让方法,不一定礼让成功,在Cpu资源比较紧张的时候,礼让的效果比较明显

join()线程的插队(这里有个面试题:有三个线程:t1,t2,t3,如何保证t3在t2之前完成,t2在t1之前完成)

package cn.tulingxueyuan.xiaoshanshan.base;

public class UseJoin {


    public static void main(String[] args) {
        JoinThread t1 = new JoinThread();
        JoinThread t2 = new JoinThread();
        JoinThread t3 = new JoinThread();
        t1.setName("t1");
        t2.setName("t2");
        t3.setName("t3");
        t1.setT(t2);
        t2.setT(t3);
        t1.start();
        t2.start();
        t3.start();

    }

}

class JoinThread extends Thread{
    Thread t ;

    public void setT(Thread t) {
        this.t = t;
    }

    @Override
    public void run() {

        if(null!=t){
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println( "线程:" + Thread.currentThread().getName()  +  "执行我的逻辑...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

复习并发编程的基础知识(一)

 守护线程:

守护线程服务于用户线程,当用户线程结束的时候,守护线程也结束了

package cn.tulingxueyuan.xiaoshanshan.base;

public class DaemonThread {

    public static void main(String[] args) throws InterruptedException {
        MyDaemonThread myDaemonThread = new MyDaemonThread();
        myDaemonThread.setDaemon(true);
        myDaemonThread.start();

        for (int i =0;i<10;i++){
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "打印出:" +i);
        }
    }
}

class MyDaemonThread extends Thread{

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "打印出:" + Math.random()*100+1);
        }
    }
}

复习并发编程的基础知识(一)

看,main线程结束了,守护线程Thread-0也结束了。文章来源地址https://www.toymoban.com/news/detail-480506.html

到了这里,关于复习并发编程的基础知识(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

            所有的操作系统都为运行在其上的程序提供服务,比如:执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等         从严格意义上来说,操作系统可被定义为一种软件,它控制计算机硬件资源,提供程序运行的环境。我们通常将这种软件称为

    2024年02月13日
    浏览(53)
  • Linux复习——基础知识

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 1. 有关早期linux系统中 sysvin的init的7个级别描述正确的是(    )[选择1项] A. init 1 关机状态     B. init 2 字符界面多用户模式

    2024年02月15日
    浏览(49)
  • 1. 线程基础知识复习

    线程基础知识复习 1把锁:synchronized(后面细讲) 2个并: 并发(concurrent): 是在同一实体上的多个事件,是在一台机器上“同时”处理多个任务,同一时刻,其实是只有一个事情再发生。 并行(parallel): 是在不同实体上的多个事件,是在多台处理器上同时处理多个任务

    2024年02月08日
    浏览(45)
  • Java ---基础知识& 期末复习

    1.Java是低级语言还是 高级语言    答:高级语言。 2.Java是面向对象的程序设计语言吗 答:是。 3. Java是编译型的计算机语言还是解释型的计算机语言。 答: 一种说法:Java是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就无法执行。 另一种说法:Java是解释型

    2024年01月16日
    浏览(58)
  • Pytorch基础知识点复习

    本篇博客是本人对pytorch使用的查漏补缺,参考资料来自 深入浅出PyTorch,本文主要以提问的方式对知识点进行回顾,小伙伴们不记得的知识点可以查一下前面的教程哦。   现在并行计算的策略是 不同的数据分布到不同的设备中,执行相同的任务(Data parallelism) 。   它的逻

    2024年01月20日
    浏览(40)
  • Python基础知识大全(适用于全面复习Python语法知识)

    python属于解释型语言 源代码(python)-解释器(逐行解释每一句源代码)-操作系统-cpu java属于编译型语言 源代码(java)-编译器-可执行文件-操作系统-cpu 容易混淆的几种表现形式 元组( ) 和列表[ ] 类似 只是元组不可以修改 这两个有点类似于C语言中的数组 集合 唯一{ } 和字典类似 只

    2024年02月02日
    浏览(46)
  • Java知识复习(八)Spring基础

    Spring :是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性 Spring主要指Spring Framework,就是指如上图所示的各项功能模块 SpringMVC主要指一种架构,MVC分别是Model模型、View视图、Controller控制器的简写,核心思想就是将数据、显示和业务逻辑分

    2023年04月18日
    浏览(43)
  • Java集合基础知识点复习

    主要分为两类: 第一个是Collection 属于单列集合,第二个是Map 属于双列集合在Collection中有两个子接口List和Set。在我们平常开发的过程中用的比较多像list接口中的实现类ArrarList和LinkedList。 在Set接口中有实现类HashSet和TreeSet。 在map接口中有很多的实现类,平时比较常见的是

    2024年04月08日
    浏览(56)
  • java基础知识点复习①

    java是一门开源的面向对象的编程语言,具有面向对象的封装、继承、多态的特点。 封装:将类的某些信息隐藏起来,只提供特定的方法来访问或修改这些隐藏信息,从而防止直接操作类中的某些属性。是通过访问权限修饰符来实现封装的,public——protected——default——pri

    2023年04月22日
    浏览(48)
  • 计算机网络安全基础知识复习

    计算机安全: 对于一个自动化的信息系统,采取措施确保信息系统资源(包括硬件、软件、固件、信息数据和通信)的完整性,可用性和保密性。 目标/服务: 认证;访问控制;数据保密性;数据完整性,不可否认性,可用性. 安全攻击 :任何危及信息系统安全的行为。 安全机

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包