09 多线程

作者:thoughtInShare 出处:http://www.cnblogs.com/thoughtInShare 欢迎转载,也请保留这段声明。谢谢!

1,进程是处于运行中的程序,并具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位;

线程是轻量级的进程,线程是进程的执行单元;

一个进程可以有多个线程,一个线程必有一个父进程;

线程可以拥有自己的栈,以及程序计数器,但不拥有系统资源;它与父进程的其他线程共享进程拥有的全部资源;

线程是独立的,它并不知道进程中是否有其他线程存在;

线程的执行是抢占式的,并发执行的;

线程的调度和管理由进程本身负责完成;

一个程序运行后至少有一个进程,一个进程至少有一个线程;

2,多线程的优势

(1)进程之间不能共享内存,但线程之间共享内存则非常容易;

(2)系统创建进程是需要为进程分配系统资源,而创建线程则代价小很多,因此使用多线程实现多任务比多进程实现多任务的效率高;

3.线程的创建和启动

方式1:继承Thread类穿件线程类

(1)定义Thread类的子类,并重写run()方法,run()描述线程需要完成的任务;

(2)创建Thread子类的实例,即创建了线程对象;

(3)调用线程对象的start()方法来启动线程;

方式2:实现Runnable接口创建线程类

(1)定义Runnable接口的实现类,并重写该接口的run()方法;

(2)创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象;

方式3:使用Callabe和Future创建线程

4.线程的生命周期

生命周期的几种状态:新建(New)就绪(Runnable)运行(Running)阻塞(Blocked)死亡(Dead)

(1)当程序使用new关键字创建了一个线程之后,该线程处于新建状态,此时它和其他Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值;此时线程对象没有表现除任何线程的动态特征;

(2)当线程对象调用了start()之后,该线程处于就绪状态,Java虚拟机为其穿件方法调用栈和线程计数器,此时线程还没开始运行,只是表示该线程可以运行了;至于线程什么时候开始执行,取决于JVM的线程调度器的调度;

(3)如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则线程处与运行状态;

如果计算机只有一个CPU,任何时刻只有一个线程处于运行状态。多处理器的机器上,将有多个线程并行;

对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间片段来处理任务,当时间片用完后,系统会剥夺该线程的系统资源,让其他线程获得执行的机会,在选择下一个线程时,系统会考虑线程的优先级;

当发现如下情况时,线程进入阻塞状态:

(1) 线程调用sleep()主动放弃所占用的系统资源;

(2) 线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞;

(3) 线程获得一个同步监视器,但该监视器被其他线程所持有;

(4) 线程在等待某个通知;

(5)程序调用线程的suspend方法将该线程挂起;

当前正在执行的线程进入阻塞状态后,其他线程获得执行的机会,被阻塞的线程在合适的机会会重新进入就绪状态,待线程调度器再次调用它;

5.线程死亡

(1)run()或call()方法执行完成,线程正常结束;

(2)线程抛出一个未捕获的exception或error;

(3)程序调用stopI();

死亡的线程不能再调用start()方法进行启动;

6.控制线程

(1)Join线程

(2)后台线程

(3)线程睡眠

(4)线程让步:

yield(),将该线程转入就绪状态;sleep(),将该线程转入睡眠状态;二者的区别如下:

(1)sleep暂停当前线程后,会给其他线程执行机会,而不理会其他线程的优先级;而yield只会给优先级相同或优先级更高的线程执行机会;

(2)sleep使线程进入阻塞状态,直到经过阻塞时间才会转入就绪状态,而yield只是将线程转入就绪状态;

(3)sleep比yield具有更好的课移植性;

7.设置线程的优先级

8.线程的同步

(1) 当有两个线程并发修改同一文件时就可能造成异常,Java的多线程支持引入同步监视器来解决此问题;通用方法就是同步代码块,

synchronized(obj)

{

//...同步代码块

}

线程开始执行同步代码块之前,必须先获得监视器的锁定;

任何时刻只有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放同步监视器的锁定;

(2)同步方法

同步方法,是使用synchronized关键字来修饰某个方法,对于同步方法而言,无须显式指定同步监视器,同步监视器为this,即该对象本身;

(3)同步锁lock

死锁,当两个线程相互等待对方释放同步监视器时就发生死锁

9.线程通信

目的是保证线程的协调运行;

时间: 2024-10-06 19:03:14

09 多线程的相关文章

Java面试09|多线程

15个顶级Java多线程面试题及回答 http://ifeve.com/15-java-faq/ 1.关于线程的状态及相互转换 (1)join()方法:能够使线程顺序执行.可以将一个任务分为多个子任务,调用join()方法等待这些子任务完成运算,然后汇总结果.需要注意这并不能保证各个子任务线程的结束顺序. (2)线程只能从就绪状态(runnable)这一条唯一路径到运行状态(running) (3)Thread类,定义了一些列的线程操作函数.例如,sleep()休眠, interrupt()中断

ABHS001-java多线程1-20--

上面是第5讲4:5511-构造thread的时候,传入stacksize代表该线程占用的stack大小如果没指定,默认是0,0代表会忽略该参数,该参数会被jni函数使用:该参数和平台有关5:5411-所以stacksize一般用虚拟机参数指定.6:5014-join..线程A里调用线程B, 即B.join.也就是说B join进来了.那就是A要等B完了再继续A.7:3813-那个java资源管理工具叫jconsole7:4815-t.interrupt()方法在线程执行sleep,wait,jo

2017年最新老男孩教育python视频全栈课程+源码笔记

官方网址:http://www.oldboyedu.com 网盘地址:2017年最新老男孩教育python视频自动化课程链接: http://pan.baidu.com/s/1mimH1PY 密码: d8ff 04-Python的发展05-Python特性介绍及与其它语言对比06-Python安装及环境准备07-编程风格要求08-Python的数据类型和运算符09-单行和多行注释10-理解ASSIC Unicode UTF-8编码11-使用和导入模块12-用户交互和格式化输出13-流程控制if

便是徐荒所带的

自己没趣走开了便是赵青衫以及http://weibo.com/2015.09.16/p/1001603887253242939273http://weibo.com/2015.09.16/p/1001603887253247120848http://weibo.com/2015.09.16/p/1001603887253247133649http://weibo.com/2015.09.16/p/1001603887253247133651http://weibo.com/2015.09.16/

百度房间撒谎发喀什经济法老师

http://www.ebay.com/cln/non.shua/cars/167418482013/2015.02.09 http://www.ebay.com/cln/lehu497/cars/167065144019/2015.02.09 http://www.ebay.com/cln/gaza240/cars/167530469015/2015.02.09 http://www.ebay.com/cln/go_qi26/cars/167224324018/2015.02.09 http:

怪我北灵院不给

要不就算平局吧都是显得极为http://weibo.com/2015.09.16/p/1001603887639781581729http://weibo.com/2015.09.16/p/1001603887639785818588http://weibo.com/2015.09.16/p/1001603887639790012974http://weibo.com/2015.09.16/p/1001603887639794164941http://weibo.com/2015.09.16/p

一道人影漫步而

一道全身包裹在不少人心头一跳http://weibo.com/09.16/2015/p/1001603887643111873409http://weibo.com/09.16/2015/p/1001603887643116067799http://weibo.com/09.16/2015/p/1001603887643120285680http://weibo.com/09.16/2015/p/1001603887643128674390http://weibo.com/09.16/2015/

黑马程序员–Java之多线程09

黑马程序员–Java之多线程09 一.线程和进程 在Java中,并发机制非常重要,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制被称为多线程.多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,它们会交替执行,彼此间可以进行通信.多线程是非常复杂的机制,在每个操作系统中的运行方式也存在差异,window操作系统是多任务操作系统,它以进程为单位.一个进程是一个包含有自身地址的程序,每个独立执行的程序都称为进程,也就是正在执行的程序.系统

iOS开发多线程篇 09 —NSOperation简单介绍

iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOpe