入门Java第十五天 线程

news2024/11/17 14:18:17

一、多线程

1.1进程和线程

进程:进程就是操作系统中运行的每一个应用程序。例如:微信,QQ

线程:线程是进程中的每一个任务

        多线程:在一个进程中,可以同时执行多个线程。同时完成多个任务。

        并发:同时发生。多个线程同时完成任务时。

我们编写的应用程序运行时,也是一个进程。在我们进程中也是有线程的。

        第一个现车给称为主线程main方法就是第一个线程。

1.2 CPU轮转时间片

内存是作用是什么?处理程序数据。

CPU是中央处理器。程序想要运行必须使用CPU。

一个CPU同一时间只能处理一个程序运行。

一个程序想要运行必须抢到CPU

1.3 Thread类

Thread线程的父类

(1) 构造方法

public Thread()

public Thread(String name)

        name 是线程的名称

public Thread(Runnable target)

(2) 常用方法

public synchronized void start()

        线程启动方法。 启动与运行现在不在是相同的概念。

        线程启动之后,表示当前这个线程对象可以被运行。

public void run()

        线程运行方法。

1.4 使用Thread类创建自定义的线程类

创建Thread类的子类。重写run的方法。为这个方法编写具体任务代码

Thread子类:

public class Thread01 extends Thread{
    @override
    public void run(){
        System.out.println("abc");
    }
}

main方法:

public static void main(String[] args){
    Thread thread = new Thread01();
    thread.start();//启动
}

1.5 为什么要用多线程

示例代码:

public class Thread01 extends Thread{
    @override
    public void run(){
        for(int i = 1;i <= 1000 ;i++){
            System.out.println(i+":abc");
        }
    }
}
public static void main(String[] args) {
    Thread thread = new Thread01();//创建了一个新的子线程。
    thread.start();//启动子线程。
    //thread.run();
    for(int i = 1;i<=1000;i++) {
        System.out.println(i+":000");
    }
}

输出: 

1:000

1:abc

2:abc

3:abc

2:000

4:abc

3:000

 在main方法中调用了thread.start();就表示在主线程中开辟了一个新的子线程。

主线程与子线程是并列的关系。二个线程之间的执行要通过抢CPU

1.6 使用Runnable接口创建线程任务

线程:线程是在进程中的每一个任务

Runnable接口就表示的任务接口。

@FunctionalInterface
public interfaceRunnable{
    public abstract void run();
}

编写Runnable接口的实现类。任务类

public class Runnbale02 implements Runnable{
    @Override
    public void run() {
        for(int i = 1;i<=1000;i++) {
            System.out.println(i+":000");
        }
    }
}

使用任务类来创建一个线程对象

将任务类交给线程对象进行加载。线程启动时就可以调用任务类的run方法。

public static void main(String[] args) {
    //使用Runnable接口的实现类
    Runnbale02 runnbale02 = new Runnbale02();
    Thread thread02 = new Thread(runnbale02);

    thread02.start();
}

1.7 使用Callable接口编写任务类

在JDK1.5加入的关于线程的新的类。 

解决了Runnable接口的二个问题:

        1 异常没有抛出。调用线程启动时类,不知道在线程执行过程中有没有出现异常。

        2 run方法没有返回值。调用线程结束之后。没有数据返回。

 编写Callable接口下的实现类。任务类

public class Callable03 implements Callable<String> {
    @Override
    public String call() throws Exception {
        for(int i = 1;i<=1000;i++) {
            System.out.println(i+":***");
        }
        return "任务Callable03执行完成!";
    }
}

1.8 使用线程池执行Callable接口的任务

(1) 线程池

池:容器。

线程池是存放大量线程对象的容器。

一个线程对象(Thread t)可不可能加载多个任务(Runnable r,Callable c)?

多个任务以串行方式,以先后顺序的方式进行执行。有多个任务可以同时使用同一个线程对象。

线程池:就是一个存放了大量线程对象的容器。

        当有任务需要执行时,从线程池中拿一个线程对象。任务执行完成之后。将线程对象还给线程池。

(2)线程池Executor接口 

实际开发时使用Executor接口的子接口ExecutorService

Submit 方法称为注册任务方法。

public interface ExcecutorService extends Executor{

        <T>Future<T> submit(Callable<T> task);

}

这是一个创建线程池对象的工具类。

通过这个类的静态方法来获得不同的线程池对象

public class Executors {

返回一个有固定大小的线程池容器对象

public static ExecutorService newFixedThreadPool(int nThreads);

返回只有一个线程对象的线程池对象

public static ExecutorService newSingleThreadExecutor()

返回一个可变化的线程池对象

public static ExecutorService newCachedThreadPool()

}

(3) 返回值Future接口 

用来接收Callable任务执行完成之后的返回值。

public interface Future<V> {

获取返回值对象的方式

V get() throws InterruptedException, ExecutionException;

}

public static void main(String[] args) {
    Callable03 callable03 = new Callable03();

    ExecutorService service = Executors.newFixedThreadPool(5);
    Future<String> future03 = service.submit(callable03);

    try {
        System.out.println(future03.get());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        service.shutdown();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

投票的链接怎么做出来的网上那些投票链接怎么做的网上投票器

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。“活动星投票”小程序在使…

【踩坑记录】使用OpenCV报错“ undefined symbol: TIFFReadRGBATileExt, version LIBTIFF_4.0”

问题描述 例如&#xff1a;使用OpenCV报错&#xff0c;找不到相关动态库&#xff1a; ImportError: /lib/libgdal.so.26: undefined symbol: TIFFReadRGBATileExt, version LIBTIFF_4.0解决方案&#xff1a; 运行前&#xff0c;先执行或者在./bashrc &#xff08;根目录下ctr…

【图像分类】卷积神经网络之ZFNet网络模型结构详解

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 1. 前言 由于AlexNet的提出,大型卷积网络开始变得流行起来,但是人们对于网络究竟为什么能表现的这么好,以及怎…

Python编写GUI界面案例:实现免费下载器

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 本次网站&#xff1a; 本文所有模块\环境\源码\教程皆可点击文章下方名片获取此处跳转 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 模块使用&#xff1a; import parsel >>> pip install parsel…

从0开始学python -41

Python3 命名空间和作用域 命名空间 先看看官方文档的一段话&#xff1a; A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是从名称到对象的映射&#xff0c;大部分的命名空间都是…

蓝牙耳机适合跑步戴吗,五款适合跑步蓝牙耳机推荐

音乐是坚持运动下去的不懈动力&#xff0c;在运动当中佩戴蓝牙耳机&#xff0c;能够让我们远离枯燥无味&#xff0c;运动更有律动感&#xff0c;运动更为畅快。运动当中佩戴的蓝牙耳机&#xff0c;佩戴舒适度以及牢固度是我们十分需要注意的&#xff0c;下面这几款比较热门的运…

IP-GUARD控制台账户输入多次错误密码锁定后该如何解锁?

其他管理员账户给锁定了,暂时只能等其锁定时间到了才可以再次输入,默认是设置是锁定30min; 1、如果急需此账户查看,可以使用admin系统管理员账户登录控制台,在工具-账户中清除这个账户的密码,重新登录设置密码。

idea远程调试线上jar包

有时候本地代码没问题但在线上运行会报错&#xff0c;这时候可以使用idea的remote功能调试线上jar包 步骤1 步骤2&#xff1a;新建remote 步骤3&#xff1a;配置服务器ip和端口 并复制生成的JVM参数供之后使用 步骤4&#xff1a;打jar包&#xff0c;并将生成的jar包放到服务…

想招到实干派程序员?你需要这种面试法

技术招聘中最痛的点其实是不精准。技术面试官或CTO们常常会向我们吐槽&#xff1a; “我经常在想&#xff0c;能不能把我们项目中的代码打印出来&#xff0c;作为候选人的面试题的一部分&#xff1f;” “能不能把一个Bug带上环境&#xff0c;让候选人来试试怎么解决&#xf…

电信网上用户资管理系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;在对目前市面上已经拥有的营业厅功能分析和整理后&#xff0c;为了保证营业厅中多种功能的分层次处理设计了一个的电信网上用户自管理系统&#xff0c;以web页面方式实现了与用户的交互&#xff0c;同时保证了移动电话计费管理系统…

数据结构期末复习总结(后章)

作者的话 作为一名计算机类的学生&#xff0c;我深知数据结构的重要性。在期末复习前&#xff0c;我希望通过这篇博客给大家一些复习建议。希望能帮助大家夯实数据结构的基础知识&#xff0c;并能够更好地掌握数据结构和算法的应用。 一、树与二叉树 1.基本概念 结点的度&am…

Google的中国用户注意!黑客正利用搜索结果投放恶意软件

2月16日研究人员发现&#xff0c;Google搜索结果中含有冒充知名软件的恶意软件下载链接。 研究人员通过测试后表示&#xff0c;攻击者为了增加浏览量&#xff0c;甚至通过在Google搜索结果中购买误导性广告&#xff0c;诱骗受害者下载安装恶意程序。 据悉&#xff0c;这些被冒…

【JavaSE】集合(Collection类)

文章目录1.集合框架1.1 collection1.2 map2. collection2.1.集合迭代2.2.contains和remove2.3集合中元素的删除3.List4.ArrayList5.LinkList6.Vector7.泛型7.1泛型初步7.2自动类型推断机制7.3 自定义泛型8.增强for循环9.Set9.1HashSet9.2 TreeSet1.集合框架 1.1 collection 1.…

4G模块DTU网关远程抄表方案(二):DL645/698协议国网电表

4G模块DTU网关远程抄表方案(二):DL645/698协议国网电表 1 DL 645协议简介 DL645协议是一种用于智能电能表的远程抄读通讯标准。制定该标准是为统一和规范多功能电能表与数据终端设备进行数据交换时的物理连接和通信链路及应用技术规范。DL645协议可用于远程监测电力传输和使用…

【2223sW1】LOG2

写在前面 好好学习&#xff0c;走出宿舍&#xff0c;走向毕设&#xff01; 一些心路历程记录&#xff0c;很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧&#xff0c;还是不要给自己的查重挖坑罢了 23.2.22 今儿收获挺多&#xff0c;所以就把上一个LOG给发了…

戴尔dell inspiron-5598电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板X99 K9 v2 Machinist处理器i5-10210U / *i7-10510U已驱动内存20GB已驱动硬盘1000GB SAMSUNG 860 QVO SATA已驱动显卡Intel UHD 620已驱动声卡Realtek ALC3204/236已驱动网卡RTL8168H Gigabit Ethernet已…

测量 R 代码运行时间的 5 种方法

简介 平常在撰写论文时&#xff0c;会需要比较算法之间的计算时间。本篇文章给出几种测量 R 代码运行时间的方法。本文是小编学习过程中的笔记&#xff0c;主要参考博客1&#xff0c;2。 1. 使用 Sys.time() 小编通常使用 Sys.time() 函数来计算时间。首先记录当前运行时刻&…

ChatGPT火到汽车圈,毫末智行、集度纷纷进场

作者 | 白日梦想家 编辑 | 于婷ChatGPT的火爆&#xff0c;已经席卷到了汽车领域。 众多相关企业宣布纷纷布局&#xff0c;车企也争相宣布将搭载类似产品。 2月初&#xff0c;百度宣布将在今年3月完成类似ChatGPT的项目“文心一言”的内部测试。据悉&#xff0c;该产品是基于百度…

Postgresql源码(101)深入分析clog组提交(clog group updates)

1 背景知识 1.1 CLOG使用的全局变量XactLastRecEnd XLogRecPtr ProcLastRecPtr InvalidXLogRecPtr; XLogRecPtr XactLastRecEnd InvalidXLogRecPtr; XLogRecPtr XactLastCommitEnd InvalidXLogRecPtr;其中ProcLastRecPtr、XactLastRecEnd更新位置XLogInsertRecord&#xf…

如何在logback.xml中自定义动态属性

原文地址&#xff1a;http://blog.jboost.cn/trick-logback-prop.html 当使用logback来记录Web应用的日志时&#xff0c;我们通过在logback.xml中配置appender来指定日志输出格式及输出文件路径&#xff0c;这在一台主机或一个文件系统上部署单个实例没有问题&#xff0c;但是…