Java学习从入门到放弃

Java学习日记–线程(一)

1.1线程的介绍

在学习多线程前,先弄明白进程和线程的区别。

进程:是指运行中的应用程序,每一个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。同样,每次执行JDK的java.exe程序,就启动了一个独立的Java虚拟机进程,该进程的任务是解析并执行Java程序代码。

线程:是指进程中的一个执行流程,有时也称为执行情景。一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,它们分别执行不同的任务。当进程内的多个线程同时运行时,这种运行方式称为并发运行。许多服务器程序,如数据库服务器和Web服务器,都支持并发运行,这些服务器能同时响应来自不同客户的请求。

进程和线程主要的区别在于每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源,比如共享一个对象或者共享已经打开的一个文件。

通俗的可以这样理解,人体可以同时进行呼吸、血液循环、思考问题等活动。用户既可以使用计算机听歌,也可以编写文档和发送邮件,而这些活动的完成可以同时进行。

一个程序运行后至少有一个进程,一个进程中可以包含多个线程,但至少有一个线程。

1.2单线程与多线程

往往在一个进程中,它包含的线程不只是一个,而是多个。因为多线程的效率往往要高于单线程。
用流程图表示,任务一和任务二是两个完全独立、互不相关的任务。

这个是单线程的环境下,完成任务一和任务二需要15s。


这个是多线程的环境下,完成任务一和任务二需要10s。

单线程的特点就是排队执行,也就是同步,就像在 cmd 中输入一条命令后,必须等待这条命令执行完才可以执行下一条命令一样。这就是单任务环境的缺点,即 CPU 利用率大幅降低。

而多线程的特点就是并发,许多子任务同时运行,举个栗子,QQ运行时就有很多的子任务在同时运行。像好友视频、下载文件、传输数据、发送表情等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在后台默默地运行。

但是也并不能说大量使用多线程效率就会提高。因为我们知道,CPU会在多个进程之间做着切换,如果我们开启的程序过多,CPU切换到每一个进程的时间也会变长,我们也会感觉机器运行变慢。所以合理的使用多线程可以提高效率,但是大量使用,并不能给我们带来效率上的提高。

1.3多线程的实例化

1.3.1继承Thread类

继承Thread类创建线程的步骤为:
(1)创建一个类继承Thread类,重写run()方法
(2)创建Thread类的子类的对象
(3)调用该对象的start()方法,该start()方法表示先开启新线程,来执行run中的逻辑

public class ThreadCreate {public static void main(String[] args){//继承Thread类MyThread thread=new MyThread();//一定要调用start来开启新线程,来执行run中的逻辑//如果直接调用run方法,不会开辟新的线程thread.start();}
}
class MyThread extends Thread{//需要重写run方法@Overridepublic void run(){for (int i=0;i<10;i++){System.out.println("子线程的进程"+i);}}
}
1.3.2通过Runnable接口

实现Runnable接口创建线程的步骤为:
(1)创建一个类并实现Runnable接口
(2)重写run()方法
(3)创建实现Runnable接口的类的对象,将该对象当做Thread类的构造方法中的参数传进去
(4)使用Thread类的构造方法创建一个对象,并调用start()方法即可运行该线程

//通过Runnable接口
Runnable r1=() ->{for (int i=0;i<10;i++){System.out.println("线程二中的逻辑:"+i);}
};
Thread t1=new Thread(r1);
t1.start();
1.3.3通过Callable接口

实现Callable接口创建线程的步骤为:
(1)创建一个类并实现Callable接口
(2)重写call()方法,将所要完成的任务的代码写进call()方法中,需要注意的是call()方法有返回值,并且可以抛出异常
(3)如果想要获取运行该线程后的返回值,需要创建Future接口的实现类的对象,即FutureTask类的对象,调用该对象的get()方法可获取call()方法的返回值
(4)使用Thread类的有参构造器创建对象,将FutureTask类的对象当做参数传进去,然后调用start()方法开启并运行该线程。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class ThreadCreate {public static void main(String[] args) throws Exception {Thread.currentThread().setName("主线程");System.out.println(Thread.currentThread().getName()+":"+"输出的结果");//创建FutureTask的对象FutureTask<String> task = new FutureTask<String>((Callable<String>) new ThreadDemo3());//创建Thread类的对象Thread thread3 = new Thread(task);thread3.setName("线程三");//开启线程thread3.start();//获取call()方法的返回值,即线程运行结束后的返回值String result = task.get();System.out.println(result);}
}
class ThreadDemo3 implements Callable<String> {@Overridepublic String call() throws Exception {System.out.println(Thread.currentThread().getName()+":"+"输出的结果");return Thread.currentThread().getName()+":"+"返回的结果";}
}
1.3.4三种常见创建线程方式的比较

Thread继承:因为Java是单继承的,继承了Thread类就没办法继承其它类了,所以一般不会使用。Thread是重写run方法并且无返回值。

Runnable接口:比Thread类更加灵活,因为是接口,没有单继承的限制,所以使用的比Thread继承多。Runnable是重写run方法并且无返回值。

Callable接口:Callable是重写的call()方法并且有返回值并可以借助FutureTask类来判断线程是否已经执行完毕或者取消线程执行。

当线程不需要返回值时,就使用Runnable;需要返回值时,就使用Callable。

一般情况下不直接把线程体代码放到Thread类中,一般通过Thread类来启动线程。

Java学习从入门到放弃相关推荐

  1. Java学习从入门到精通的学习建议

    想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...

  2. Java学习从入门到精通-旧版

    为什么80%的码农都做不了架构师?>>>    Java学习从入门到精通-旧版 http://tech.ccidnet.com/art/3737/20051017/465333_1. ...

  3. 深度学习---从入门到放弃(九)RNN入门

    深度学习-从入门到放弃(九)RNN入门 1.RNN简介 RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络.回想一下我们之前说到过的CNN,它可以通过在空间上共 ...

  4. 深度学习---从入门到放弃(一)pytorch基础

    深度学习-从入门到放弃(一)pytorch Tensor 类似于numpy的array,pandas的dataframe:在pytorch里的数据结构是tensor,即张量 tensor简单操作 1. ...

  5. Java学习从入门到精通

    Java Learning Path (一).工具篇 一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envi ...

  6. Java学习从入门到精通[转]

    Java Learning Path (一).工具篇   一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime En ...

  7. 真正的Java学习从入门到精通

    一. 工具篇JDK (Java Development Kit) oF[l�bZk0   `WR4j-   JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirn ...

  8. Java学习之入门教程

    Java编译软件有很多,下面小编来告诉大家具体怎么使用. 内容简要 1.如何构建Java开发环境? 2.编译器javac用法入门 3.运行Java编译结果文件 0.开始之前 -- JDK的下载与安装 ...

  9. [微信小程序基础]Java Script从入门到放弃之首次接触Java Script

    文章目录 前言 一.JS入门学习之路 二.第一章: 做好准备 1.如何插入JS程序 2.如何引用外部JS文件 3.认识语句和符号 4.注释很重要 5.什么是变量 6.判断语句 7.什么是函数 三.第二 ...

  10. Java学习路线·入门

    Java学习路线是CSDN面向开发者提供系统化「学+练」产品,帮助每一位学习者成为一名优秀的Java工程师. 学习路线系统的涵盖了Java领域内容从初级到进阶所需要学习的一系列「知识点」,内容覆盖Ja ...

最新文章

  1. 【The final】软件工程实践总结
  2. 转Delphi中Create(nil),Create(self),Create(Application)区别
  3. tcptracerte参数_TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute【转】
  4. 13建造者模式(Builder)
  5. 没有任何权力的“项目经理”该如何当?
  6. linux netstat服务,linux netstat查看服务和端口状态
  7. 解码2017双11:全球狂欢新记录背后的阿里云存储
  8. 软件技术论坛_新一代三维GIS软件技术论坛在南宁召开
  9. 史蒂芬.霍金:警惕政府“人工智能军备竞赛”
  10. 加入域时出现以下错误 登陆失败 该目标账户名称不正确_Windows 10 20H1新加入的这些功能,你应该用得上...
  11. THINKPHP获取路径
  12. 尚硅谷-Spring Cloud
  13. 好看的登录html界面,很漂亮的用户登录界面HTML模板
  14. 星环大数据使用经验总结
  15. vs2015安装msdn
  16. 用于暴露感测的太阳传感器_凯利讯半导体
  17. 计算机硬盘隐,终极电脑磁盘隐藏方法大全
  18. 媒体 | 冒志鸿:理想nine percent最难寻
  19. Opencv中waitKey()
  20. matlab diag函数生成矩阵,Matlab矩阵运算函数-blkdiag函数

热门文章

  1. 计算机网络基础知识整理
  2. firebug下载时出现there was an error loading firebug
  3. UEFI开发之应用开发
  4. 如何读群晖硬盘_群晖直接读取Windows硬盘-eSATA挂载
  5. c语言蠕虫病毒源码,蠕虫病毒源码!附带解毒源码!
  6. 量子力学原理-波恩的概率论
  7. 【AD封装】插件电感,变压器(带3D)
  8. 交换机端口镜像配置大全【汇集22个各种品牌交换机】
  9. 【JY】2021全国首届工程仿真大赛154个项目视频教程分享
  10. 【rmzt】阳光美女win7主题