Java第三阶段学习(六、多线程)
一、进程和线程的区别:
进程:指正在运行的程序,当一个程序进入内存运行,就变成一个进程。
线程:线程是进程的一个执行单元。
总结:一个程序运行后至少会有一个进程,一个进程可以有多个线程。
多线程:多线程就是一个程序有多个线程在进行。
多线程程序与单线程程序的区别:
单线程程序:若有多个任务同时执行,只能执行完上一个程序后,才可以执行下一个程序。
多线程程序:若有多个程序可以同时执行。
二、程序运行原理
1.分时调度:CPU为线程平均分配使用时间,所有线程轮流使用CPU
2.抢占式调度:优先让优先级高的线程使用,若优先级相同,则会随机选择一个线程使用,Java使用的就是抢占式调度。例如:当同时打开多个软件程序的时候,会感觉是在同时运行,其实这个时候,CPU是在多个程序之间高速切换。
结论:多线程并不会提高程序的运行速率,但能够提高的运行效率,让CPU的效率更高效,使用率更高。
三、主线程
package com.oracle.Demo01; public class Demo02 {
//main的主线程
//程序从上到下执行的过程
//Demo02在编译运行的时候,会启动JVM,运行Demo02,main,找OS去开线程
//对于你CPU来说有了一个执行路径,运行main方法路径有个名字叫"main",也就是主线程
//thread:线程
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<1000000;i++){
System.out.println(i);
}
System.out.println("这是最后一句话");
} }
当运行以上代码时,只有在将数字打印完毕后,才会打印“这是最后一句话”,这是因为jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。
四、Thread类 (线程类)
1、创建线程类的两种方法:
1.1继承Thread类:
步骤:1.创建一个类继承自Thread类
2.重写run方法
3.创建子类对象,就是创建线程对象
4.调用.start()方法,开启线程并让线程执行,并且告诉JVM去执行run方法
自定义类:
package com.oracle.Demo02;
//用继承Thread类的方式创建线程方式
public class MyThread extends Thread{
public void run() {
for(int i=0;i<100;i++){
System.out.println("这是新建的线程"+i);
}
}
}
测试类:
package com.oracle.Demo02; public class Test {
//JVM去找OS开了俩线程
//对于你的CPU来说就有了两条路径,这两条路径都会被CPU执行,CPU有自己选择的权利,所以会出现随机性的结果,
//你也可以理解为是两个线程在抢夺CPU的资源(时间)
//OS:系统程序
public static void main(String[] args) {
MyThread my=new MyThread();
my.start();
for(int i=0;i<100;i++){
System.out.println("这是主线程"+i);
}
}
}
调用run()方法和调用start()方法的区别:调用run方法不会开启新线程,调用start会开启新线程
1.2实现Runnable接口:
步骤:1、定义类实现Runnable接口。
2、覆盖接口中的run方法。。
3、创建Thread类的对象
4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
5、调用Thread类的start方法开启线程。
自定义类:
package com.oracle.Demo03;
//通过实现Runnable接口,创建新线程
public class RunThread implements Runnable{
public void run() {
for(int i=0;i<10;i++){
System.out.println(i);
} } }
测试类:
package com.oracle.Demo03;
//通过实现Runnable接口的方法来开启新线程
public class Test4 {
public static void main(String[] args) {
Thread t=new Thread(new RunThread());
t.start();
for(int i=0;i<10;i++){
System.out.println("main"+i);
}
}
}
1.3多线程的内存图解
多线程执行时,在栈内存中,其实每一个执行线程都有一片自己所属的栈内存空间。进行方法的压栈和弹栈。
当执行线程的任务结束了,线程自动在栈内存中释放了。但是当所有的执行线程都结束了,那么进程就结束了。
总结:每一个线程都是在内存中开一块新的内存区,并不会在旧的线程后面排队
1.4获取线程名称的方法:
1.Thread.currentThread()获取当前线程对象
2.Thread.currentThread().getName();获取当前线程对象的名称
1.5线程的匿名内部类使用
package com.oracle.Demo04;
//线程匿名内部类
public class Demo01 {
public static void main(String[] args) {
//匿名内部类的前提:必须要有继承或实现
//格式: new 父类或接口(){
// 要重写的方法;
// }.方法();
//1.继承Thread类的匿名对象
new Thread(){
public void run() {
for(int i=0;i<5;i++){
System.out.println("Thread"+i);
}
}
}.start();
//2.实现Runnable接口的匿名内部类
Runnable r=new Runnable(){
public void run() {
for(int i=0;i<5;i++){
System.out.println("Runnable"+i);
} } };
Thread t=new Thread(r);
t.start();
}
}
Java第三阶段学习(六、多线程)的更多相关文章
- Java第三阶段学习(七、线程池、多线程)
一.线程池 1.概念: 线程池,其实就是一个容纳多个线程的容器,其中的线程可以重复使用,省去了频繁创建线程对象的过程,无需反复创建线程而消耗过多资源,是JDK1.5以后出现的. 2.使用线程池的方式- ...
- Java第三阶段学习(十、XML学习)
一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...
- Java第三阶段学习(九、类加载器、反射)
一.类加载器 1.类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.1 加载: 就是指将class文件读入内存,并为之自动 ...
- Java第三阶段学习(八:网络通信协议、UDP与TCP协议)
一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...
- Java第三阶段学习(三、字符流、转换流)
一.字节流读取中文时出现的问题: 文件中有中文时,用字节流读取会出现乱码的问题,因为一个中文为两个字节. 二.字符编码表 编码表:其实就是生活中字符和计算机二进制的对应关系表. 1.ascii: 一个 ...
- Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)
一.JSP技术 1.jsp脚本和注释 jap脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部,比如写在doget.dopost 内的代码 2) ...
- Java第三阶段学习(十三、会话技术、Cookie技术与Session技术)
一.会话技术 1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的. 2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...
- Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)
一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...
- Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)
一.Servlet简介 1.什么是servlet: sun公司提供的一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API动态的向 ...
随机推荐
- 【UOJ#67】新年的毒瘤(Tarjan)
[UOJ#67]新年的毒瘤(Tarjan) 题面 UOJ 题解 一棵\(n\)个节点的树显然有\(n-1\)条边,在本题中意味着删去一个点之后还剩下\(n-2\)条边.那么找到所有度数为\(m-(n- ...
- bzoj1016/luogu4208 最小生成树计数 (kruskal+暴搜)
由于有相同权值的边不超过10条的限制,所以可以暴搜 先做一遍kruskal,记录下来每个权值的边使用的数量(可以离散化一下) 可以证明,对于每个权值,所有的最小生成树中选择的数量是一样的.而且它们连成 ...
- POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for UNIX / UVAlive 5418 A Plug for UNIX / SCU 1671 A Plug for UNIX (网络流)
POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for ...
- bzoj2616: SPOJ PERIODNI——笛卡尔树+DP
不连续的处理很麻烦 导致序列DP又找不到优秀的子问题 自底向上考虑? 建立小根堆笛卡尔树 每个点的意义是:高度是(自己-father)的横着的极大矩形 子问题具有递归的优秀性质 f[i][j]i为根子 ...
- 前端常用功能记录(三)—datatables表格初始化
其实上篇说的也算是jQuery Datatables的初始化,但主要是对某些字段意义的理解.下面记录的是datatables常用的功能的初始化. 数据源 我经常使用的有两种,一种是JavaScript ...
- JAVA字符串格式化-String.format()的使用 【生成随机数补0操作】
转: JAVA字符串格式化-String.format()的使用 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的s ...
- dedecms添加文章时提示标题为空,编辑文章时编辑器空白的解决办法
dedecms添加文章时提示标题为空,编辑文章时编辑器空白的解决办法 dedecms出现这个问题与代码无关,主要是和PHP的版本有关,用的PHP5.4,更换成PHP5.2之后就不会有这个问题了. 问题 ...
- python singleton design pattern super() 多继承
python singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...
- Nginx的基本配置案例
Nginx的基本配置案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx配置虚拟主机 .操作系统环境 [root@yinzhengjie ~]# cat /etc ...
- PHP使用数据库的并发问题
在并行系统中并发问题永远不可忽视.尽管PHP语言原生没有提供多线程机制,那并不意味着所有的操作都是线程安全的.尤其是在操作诸如订单.支付等业务系统中,更需要注意操作数据库的并发问题. 接下来我通过一个 ...