首页 技术 正文
技术 2022年11月16日
0 收藏 903 点赞 2,588 浏览 6942 个字

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 24.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 18.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 18.0px}
span.s1 {font-kerning: none}
span.s2 {font: 14.0px Times; font-kerning: none}
span.s3 {font: 14.0px ‘Songti SC’; font-kerning: none}
–>

多线程

一、线程的概念

1.1 程序、进程、线程

程序:Program 是一个静态的概念

进程:Process 是一个动态的概念

进程是程序的一次动态执行过程,占用特定的地址空间。

每个进程都是独立的,由三部分组成cpu,data,code

缺点:内存的浪费,cpu的负担

线程:Thread,是进程中一个“单一的连续控制流程”/执行路径                线程又被称为轻量级进程

所有线程都是并发运行的,并且彼此独立

一个进程可拥有多个并发的线程

一个进程中的线程共同分享相同的内存单元/内存地址空间->         可以访问相同的变量和对象,而且它们从同一堆中分配对象->通信、数据交换、同步操作

由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更加简便而且信息传递的速度也更快。

1、程序:指令集 静态概念

2、进程:操作系统 调度程序 动态概念

3、线程:线程是在进程内有多条执行路径

main方法称为主线程

异常机制也是多线程

JAVA基础复习与总结<九> 线程的基本概念_Thread继承创建线程

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 18.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000}
span.s1 {font: 14.0px Times; font-kerning: none}
span.s2 {font-kerning: none}
span.s3 {font: 14.0px ‘Songti SC’; font-kerning: none}
–>

1.2 线程的状态

1.2.1 新生状态: 

用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)

1.2.2 就绪状态: 

处于就绪状态的线程已经具备了运行条件,但是还没有分配到CPU,处于线程就绪队列,等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“CPU调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。

1.2.3 运行状态: 

在运行状态的线程执行自己的run方法中代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。如果在给定的时间片内没有执行结果,就会被系统给换下来回到等待执行状态。

1.2.4 阻塞状态: 

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 18.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 18.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
span.s1 {font-kerning: none}
span.s2 {font: 14.0px Times; font-kerning: none}
span.s3 {font: 14.0px ‘Songti SC’; font-kerning: none}
span.s4 {font: 18.0px Times; font-kerning: none}
–>

处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态,在阻塞状态的线程不能进入就绪队列。只有当引进阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。

 1.2.5 死亡状态: 

死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有两个。一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop或destroy方法来终止一个线程(不推荐使用这两个方法,前者会产生异常,后者是强制终止,不会释放锁。)

JAVA基础复习与总结<九> 线程的基本概念_Thread继承创建线程

1.3 线程查看基本信息的方法

JAVA基础复习与总结<九> 线程的基本概念_Thread继承创建线程

二、线程创建之一_继承_Thread

2.1 Thread基本概念

JAVA基础复习与总结<九> 线程的基本概念_Thread继承创建线程

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 17.0px; font: 14.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000; background-color: #ffffff}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 18.0px}
span.s1 {font-kerning: none}
span.s2 {font: 14.0px Times; font-kerning: none}
–>

Thread类实现了Runnable接口,在Thread类中,有一些比较关键的属性,比如name是表示Thread的名字,可以通过Thread类的构造器中的参数来指定线程名字,priority表示线程的优先级(最大值为10,最小值为1,默认值为5),daemon表示线程是否是守护线程,target表示要执行的任务。

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px ‘Songti SC’; color: #000000; -webkit-text-stroke: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 18.0px}
span.s1 {font-kerning: none}
span.s2 {font: 14.0px ‘Songti SC’; font-kerning: none}
span.s3 {font: 14.0px Times; font-kerning: none}
–>

Java中负责线程的类是Java.lang.Thread这个类

可以通过创建Thread的实例来创建新的线程

每个线程都是通过某个特定Thread对象所对应的方法run()来完成操作的,方法run()称为线程体

通过调用Thread类的start()方法来启动一个线程

线程的创建方法就是写出一个子类

class PrimeThread extends Thread {

}

<!–
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 14.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 18.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #629755; -webkit-text-stroke: #629755}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px ‘Songti SC’; color: #629755; -webkit-text-stroke: #629755}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000; -webkit-text-stroke: #000000; min-height: 14.0px}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #000000; -webkit-text-stroke: #000000}
p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #cc7832; -webkit-text-stroke: #cc7832}
p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #cc7832; -webkit-text-stroke: #cc7832; min-height: 14.0px}
p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Times; color: #7b8018; -webkit-text-stroke: #7b8018}
span.s1 {font-kerning: none}
span.s2 {font: 14.0px ‘Songti SC’; font-kerning: none}
span.s3 {font: 12.0px Times; font-kerning: none}
span.s4 {font-kerning: none; color: #cc7832; -webkit-text-stroke: 0px #cc7832}
span.s5 {font-kerning: none; color: #000000; -webkit-text-stroke: 0px #000000}
span.s6 {font-kerning: none; color: #ffc66d; -webkit-text-stroke: 0px #ffc66d}
span.s7 {font-kerning: none; color: #7b8018; -webkit-text-stroke: 0px #7b8018}
span.s8 {font: 12.0px ‘Songti SC’; font-kerning: none; color: #7b8018; -webkit-text-stroke: 0px #7b8018}
span.s9 {font-kerning: none; color: #6897bb; -webkit-text-stroke: 0px #6897bb}
span.s10 {font-kerning: none; color: #9876aa; -webkit-text-stroke: 0px #9876aa}
span.s11 {font-kerning: none; color: #6a8759; -webkit-text-stroke: 0px #6a8759}
span.s12 {font: 12.0px ‘Songti SC’; font-kerning: none; color: #6a8759; -webkit-text-stroke: 0px #6a8759}
span.s13 {font: 12.0px ‘Songti SC’; font-kerning: none}
span.s14 {font: 14.0px Times; font-kerning: none}
–>

2.2 Thread代码实例

/**

* 模拟龟兔赛跑

* 1、创建多线程,继承Thread+重写run(线程体)

* 2、使用线程:创建子类对象+对象.start()  线程启动

*/

class Rabbit extends Thread{

public void run(){

//线程题

super.run();

for(int i=0;i<100;i++){

System.out.println(“兔子跑了”+i+”步”);

}

}

}

class Tortoise extends Thread{

public void run(){

//线程题

super.run();

for(int i=0;i<100;i++){

System.out.println(“乌龟跑了”+i+”步”);

}

}

}

public class RabbitApp {

public static void main(String[] args){

//创建子类对象

Rabbit rab = new Rabbit();

Tortoise tor = new Tortoise();

//调用start方法

rab.start();  //不要调用run方法,start内部会启动

tor.start();  //开辟多条方法必须调用start方法,放在cpu中让它自己管着

//如果调用run方法又会恢复为按顺序执行

for(int i=0;i<100;i++){

System.out.println(“main ==>”+i);

}

}

}

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,581
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918