当前位置:首页 » 编程语言 » 进程和线程java

进程和线程java

发布时间: 2024-07-30 21:49:50

java基本概念之线程和进程有什么区别

1.定义
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

2.关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

3.区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

4.优缺点
线程和进程在使用上各有优缺点:
线程执行开销小,但不利于资源的管理和保护;
而进程正相反。
同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

㈡ java 中线程与进程的区别是什么

进程,是针对于操作系统而言的
线程,是java中一个重要的类,主要用来多个方法一起执行
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

㈢ java 多线程是什么一个处理器怎么同时处理多个程序

进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和转换只需要较小的系统开销。
Java支持多线程编程,因此用Java编写的应用程序可以同时执行多个任务。Java的多线程机制使用起来非常方便,用户只需关注程序细节的实现,而不用担心后台的多任务系统。
Java语言里,线程表现为线程类。Thread线程类封装了所有需要的线程操作控制。在设计程序时,必须很清晰地区分开线程对象和运行线程,可以将线程对象看作是运行线程的控制面板。在线程对象里有很多方法来控制一个线程是否运行,睡眠,挂起或停止。线程类是控制线程行为的唯一的手段。一旦一个Java程序启动后,就已经有一个线程在运行。可通过调用Thread.currentThread方法来查看当前运行的是哪一个线程。

class ThreadTest{
public static void main(String args[]){
Thread t = Thread.currentThread();
t.setName("单线程"); //对线程取名为"单线程"
t.setPriority(8);
//设置线程优先级为8,最高为10,最低为1,默认为5
System.out.println("The running thread: " + t);
// 显示线程信息
try{
for(int i=0;i<3;i++){
System.out.println("Sleep time " + i);
Thread.sleep(100); // 睡眠100毫秒
}
}catch(InterruptedException e){// 捕获异常
System.out.println("thread has wrong");
}
}
}

多线程的实现方法
继承Thread类
可通过继承Thread类并重写其中的run()方法来定义线程体以实现线程的具体行为,然后创建该子类的对象以创建线程。
在继承Thread类的子类ThreadSubclassName中重写run()方法来定义线程体的一般格式为:
public class ThreadSubclassName extends Thread{
public ThreadSubclassName(){
..... // 编写子类的构造方法,可缺省
}
public void run(){
..... // 编写自己的线程代码
}
}
用定义的线程子类ThreadSubclassName创建线程对象的一般格式为:
ThreadSubclassName ThreadObject =
new ThreadSubclassName();
然后,就可启动该线程对象表示的线程:
ThreadObject.start(); //启动线程

应用继承类Thread的方法实现多线程的程序。本程序创建了三个单独的线程,它们分别打印自己的“Hello World!”。
class ThreadDemo extends Thread{
private String whoami;
private int delay;
public ThreadDemo(String s,int d){
whoami=s;
delay=d;
}
public void run(){
try{
sleep(delay);
}catch(InterruptedException e){ }
System.out.println("Hello World!" + whoami
+ " " + delay);
}
}
public class MultiThread{
public static void main(String args[]){
ThreadDemo t1,t2,t3;
t1 = new ThreadDemo("Thread1",
(int)(Math.random()*2000));
t2 = new ThreadDemo("Thread2",
(int)(Math.random()*2000));
t3 = new ThreadDemo("Thread3",
(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();
}
}

实现Runnable接口
编写多线程程序的另一种的方法是实现Runnable接口。在一个类中实现Runnable接口(以后称实现Runnable接口的类为Runnable类),并在该类中定义run()方法,然后用带有Runnable参数的Thread类构造方法创建线程。
创建线程对象可用下面的两个步骤来完成:
(1)生成Runnable类ClassName的对象
ClassName RunnableObject = new ClassName();
(2)用带有Runnable参数的Thread类构造方法创建线程对象。新创建的线程的指针将指向Runnable类的实例。用该Runnable类的实例为线程提供 run()方法---线程体。
Thread ThreadObject = new Thread(RunnableObject);
然后,就可启动线程对象ThreadObject表示的线程:
ThreadObject.start();
在Thread类中带有Runnable接口的构造方法有:
public Thread(Runnable target);
public Thread(Runnable target, String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,Runnable target,
String name);
其中,参数Runnable target表示该线程执行时运行target的run()方法,String name以指定名字构造线程,ThreadGroup group表示创建线程组。
用Runnable接口实现的多线程。
class TwoThread implements Runnable{
TwoThread(){
Thread t1 = Thread.currentThread();
t1.setName("第一主线程");
System.out.println("正在运行的线程: " + t1);
Thread t2 = new Thread(this,"第二线程");
System.out.println("创建第二线程");
t2.start();
try{
System.out.println("第一线程休眠");
Thread.sleep(3000);
}catch(InterruptedException e){
System.out.println("第一线程有错");
}
System.out.println("第一线程退出");
}
public void run(){
try{
for(int i = 0;i < 5;i++){
System.out.println(“第二线程的休眠时间:”
+ i);
Thread.sleep(1000);
}
}catch(InterruptedException e){
System.out.println("线程有错");
}
System.out.println("第二线程退出");
}
public static void main(String args[]){
new TwoThread();
}
}
程序运行结果如下:
正在运行的线程: Thread[第一主线程,5,main
创建第二线程
第一线程休眠
第二线程的休眠时间:0
第二线程的休眠时间:1
第二线程的休眠时间:2
第一线程退出
第二线程的休眠时间:3
第二线程的休眠时间:4
第二线程退出

至于一个处理器同时处理多个程序,其实不是同时运行多个程序的,简单的说,如果是单核的CPU,在运行多个程序的时候其实是每个程序轮流占用CPU的,只是每个程序占用的时间很短,所以我们人为的感觉是“同时”运行多个程序。

㈣ 鑳借В閲娄竴涓媕ava镄勭嚎绋嬬殑浣跨敤

闅忕潃璁$畻链虹殑椋为熷彂灞曪纴涓浜鸿$畻链轰笂镄勬搷浣灭郴缁熶篃绾风悍閲囩敤澶氢换锷″拰鍒嗘椂璁捐★纴灏嗘棭链熷彧链夊ぇ鍨嬭$畻链烘墠鍏锋湁镄勭郴缁熺壒镐у甫鍒颁简涓浜鸿$畻链虹郴缁熶腑銆备竴鑸鍙浠ュ湪钖屼竴镞堕棿鍐呮墽琛屽氢釜绋嫔簭镄勬搷浣灭郴缁熼兘链夎繘绋嬬殑姒傚康銆备竴涓杩涚▼灏辨槸涓涓镓ц屼腑镄勭▼搴忥纴钥屾疮涓涓杩涚▼閮芥湁镊宸辩嫭绔嬬殑涓鍧楀唴瀛樼┖闂淬佷竴缁勭郴缁熻祫婧愩傚湪杩涚▼姒傚康涓锛屾疮涓涓杩涚▼镄勫唴閮ㄦ暟鎹鍜岀姸镐侀兘鏄瀹屽叏镫绔嬬殑銆侸ava绋嫔簭阃氲繃娴佹带鍒舵潵镓ц岀▼搴忔祦锛岀▼搴忎腑鍗曚釜椤哄簭镄勬祦鎺у埗绉颁负绾跨▼锛屽氱嚎绋嫔垯鎸囩殑鏄鍦ㄥ崟涓绋嫔簭涓鍙浠ュ悓镞惰繍琛屽氢釜涓嶅悓镄勭嚎绋嬶纴镓ц屼笉钖岀殑浠诲姟銆傚氱嚎绋嬫剰锻崇潃涓涓绋嫔簭镄勫氲岃鍙ュ彲浠ョ湅涓婂幓鍑犱箮鍦ㄥ悓涓镞堕棿鍐呭悓镞惰繍琛屻

绾跨▼涓庤繘绋嬬浉浼硷纴鏄涓娈靛畬鎴愭煇涓鐗瑰畾锷熻兘镄勪唬镰侊纴鏄绋嫔簭涓鍗曚釜椤哄簭镄勬祦鎺у埗锛涗絾涓庤繘绋嬩笉钖岀殑鏄锛屽悓绫荤殑澶氢釜绾跨▼鏄鍏变韩涓鍧楀唴瀛樼┖闂村拰涓缁勭郴缁熻祫婧愶纴钥岀嚎绋嬫湰韬镄勬暟鎹阃氩父鍙链夊井澶勭悊鍣ㄧ殑瀵勫瓨鍣ㄦ暟鎹锛屼互鍙娄竴涓渚涚▼搴忔墽琛屾椂浣跨敤镄勫爢镙堛傛墍浠ョ郴缁熷湪浜х敓涓涓绾跨▼锛屾垨钥呭湪钖勪釜绾跨▼涔嬮棿鍒囨崲镞讹纴璐熸媴瑕佹瘆杩涚▼灏忕殑澶氾纴姝e洜濡傛わ纴绾跨▼琚绉颁负杞昏礋钻疯繘绋嬶纸light-weight process锛夈备竴涓杩涚▼涓鍙浠ュ寘钖澶氢釜绾跨▼銆

涓涓绾跨▼鏄涓涓绋嫔簭鍐呴儴镄勯‘搴忔带鍒舵祦銆
1. 杩涚▼锛氭疮涓杩涚▼閮芥湁镫绔嬬殑浠g爜鍜屾暟鎹绌洪棿锛堣繘绋嬩笂涓嬫枃锛 锛岃繘绋嫔垏鎹㈢殑寮阌澶с
2. 绾跨▼锛氲交閲忕殑杩涚▼锛屽悓涓绫荤嚎绋嫔叡浜浠g爜鍜屾暟鎹绌洪棿锛屾疮涓绾跨▼链夌嫭绔嬬殑杩愯屾爤鍜岀▼搴忚℃暟鍣锛圥C锛夛纴绾跨▼鍒囨崲镄勫紑阌灏忋
3. 澶氲繘绋嬶细鍦ㄦ搷浣灭郴缁熶腑锛岃兘钖屾椂杩愯屽氢釜浠诲姟绋嫔簭銆
4. 澶氱嚎绋嬶细鍦ㄥ悓涓搴旂敤绋嫔簭涓锛屾湁澶氢釜椤哄簭娴佸悓镞舵墽琛屻

6锛1锛1 绾跨▼镄勬傚康妯″瀷

Java鍐呭湪鏀鎸佸氱嚎绋嬶纴瀹幂殑镓链夌被閮芥槸鍦ㄥ氱嚎绋嬩笅瀹氢箟镄勶纴Java鍒╃敤澶氱嚎绋嬩娇鏁翠釜绯荤粺鎴愪负寮傛ョ郴缁熴侸ava涓镄勭嚎绋嬬敱涓夐儴鍒嗙粍鎴愶纴濡傚浘6.1镓绀恒

1. 铏氭嫙镄凛PU锛屽皝瑁呭湪Java.lang.Thread绫讳腑銆
2. CPU镓镓ц岀殑浠g爜锛屼紶阃掔粰Thread绫汇
3. CPU镓澶勭悊镄勬暟鎹锛屼紶阃掔粰Thread绫汇

锲6.1绾跨▼

6. 1. 2 绾跨▼浣(1)

Java镄勭嚎绋嬫槸阃氲繃Java.lang.Thread绫绘潵瀹炵幇镄勚傚綋鎴戜滑鐢熸垚涓涓猅hread绫荤殑瀵硅薄涔嫔悗,涓涓鏂扮殑绾跨▼灏变骇鐢熶简銆

姝ょ嚎绋嫔疄渚嬭〃绀筼ava瑙i喷鍣ㄤ腑镄勭湡姝g殑绾跨▼锛岄氲繃瀹冨彲浠ュ惎锷ㄧ嚎绋嬨佺粓姝㈢嚎绋嬨佺嚎绋嬫寕璧风瓑锛屾疮涓绾跨▼閮芥槸阃氲繃绫籘hread鍦↗ava镄勮蒋浠跺寘Java.lang涓瀹氢箟锛屽畠镄勬瀯阃犳柟娉曚负锛

public Thread 锛圱hreadGroup group锛孯unnable target锛孲tring name锛夛绂

鍏朵腑锛実roup 鎸囨槑璇ョ嚎绋嬫墍灞炵殑绾跨▼缁勶绂target瀹为檯镓ц岀嚎绋嬩綋镄勭洰镙囧硅薄锛屽畠蹇呴’瀹炵幇鎺ュ彛Runnable锛 name涓虹嚎绋嫔悕銆侸ava涓镄勬疮涓绾跨▼閮芥湁镊宸辩殑钖岖О锛孞ava鎻愪緵浜嗕笉钖孴hread绫绘瀯阃犲櫒锛屽厑璁哥粰绾跨▼鎸囧畾钖岖О銆傚傛灉name涓簄ull镞讹纴鍒橨ava镊锷ㄦ彁渚涘敮涓镄勫悕绉般
褰扑笂杩版瀯阃犳柟娉旷殑镆愪釜鍙傛暟涓簄ull镞讹纴鎴戜滑鍙寰楀埌涓嬮溃镄勫嚑涓鏋勯犳柟娉曪细

public Thread 锛堬级锛
public Thread 锛圧unnable target锛夛绂
public Thread 锛圧unnable target锛孲tring name锛夛绂
public Thread 锛圫tring name锛夛绂
public Thread 锛圱hreadGroup group锛孯unnable target锛夛绂
public Thread 锛圱hreadGroup group锛孲tring name锛夛绂

涓涓绫诲0鏄庡疄鐜癛unnable鎺ュ彛灏卞彲浠ュ厖褰撶嚎绋嬩綋锛屽湪鎺ュ彛Runnable涓鍙瀹氢箟浜嗕竴涓鏂规硶 run锛堬级锛
public void run锛堬级锛

浠讳綍瀹炵幇鎺ュ彛Runnable镄勫硅薄閮藉彲浠ヤ綔涓轰竴涓绾跨▼镄勭洰镙囧硅薄锛岀被Thread链韬涔熷疄鐜颁简鎺ュ彛Runnable锛屽洜姝ゆ垜浠鍙浠ラ氲繃涓ょ嶆柟娉曞疄鐜扮嚎绋嬩綋銆

锛堜竴锛夊畾涔変竴涓绾跨▼绫伙纴瀹幂户镓跨嚎绋嬬被Thread骞堕吨鍐椤叾涓镄勬柟娉 run锛堬级锛岃繖镞跺湪鍒濆嫔寲杩欎釜绫荤殑瀹炰緥镞讹纴鐩镙噒arget鍙涓簄ull锛岃〃绀虹敱杩欎釜瀹炰緥瀵规潵镓ц岀嚎绋嬩綋銆傜敱浜嶫ava鍙鏀鎸佸崟閲岖户镓匡纴鐢ㄨ繖绉嶆柟娉曞畾涔夌殑绫讳笉鑳藉啀缁ф圹鍏跺畠鐖剁被銆

锛堜簩锛夋彁渚涗竴涓瀹炵幇鎺ュ彛Runnable镄勭被浣滀负涓涓绾跨▼镄勭洰镙囧硅薄锛屽湪鍒濆嫔寲涓涓猅hread绫绘垨钥匮hread瀛愮被镄勭嚎绋嫔硅薄镞讹纴鎶婄洰镙囧硅薄浼犻掔粰杩欎釜绾跨▼瀹炰緥锛岀敱璇ョ洰镙囧硅薄鎻愪緵绾跨▼浣 run锛堬级銆傝繖镞讹纴瀹炵幇鎺ュ彛Runnable镄勭被浠岖劧鍙浠ョ户镓垮叾瀹幂埗绫汇

姣忎釜绾跨▼閮芥槸阃氲繃镆愪釜鐗瑰畾Thread瀵硅薄镄勬柟娉时un( )𨱒ュ畬鎴愬叾镎崭綔镄勶纴鏂规硶run( )绉颁负绾跨▼浣撱傚浘6.2琛ㄧず浜呙ava绾跨▼镄勪笉钖岀姸镐佷互鍙婄姸镐佷箣闂磋浆鎹㈡墍璋幂敤镄勬柟娉曘

锲6.2 绾跨▼镄勭姸镐

1. 鍒涘缓鐘舵(new Thread)
镓ц屼笅鍒楄鍙ユ椂锛岀嚎绋嫔氨澶勪簬鍒涘缓鐘舵侊细
Thread myThread = new MyThreadClass( );
褰扑竴涓绾跨▼澶勪簬鍒涘缓鐘舵佹椂锛屽畠浠呬粎鏄涓涓绌虹殑绾跨▼瀵硅薄锛岀郴缁熶笉涓哄畠鍒嗛厤璧勬簮銆

2. 鍙杩愯岀姸镐( Runnable )
Thread myThread = new MyThreadClass( );
myThread.start( );
褰扑竴涓绾跨▼澶勪簬鍙杩愯岀姸镐佹椂锛岀郴缁熶负杩欎釜绾跨▼鍒嗛厤浜嗗畠闇镄勭郴缁熻祫婧愶纴瀹夋帓鍏惰繍琛屽苟璋幂敤绾跨▼杩愯屾柟娉曪纴杩欐牱灏变娇寰楄ョ嚎绋嫔勪簬鍙杩愯( Runnable )鐘舵併傞渶瑕佹敞镒忕殑鏄杩欎竴鐘舵佸苟涓嶆槸杩愯屼腑鐘舵侊纸Running )锛屽洜涓虹嚎绋嬩篃璁稿疄闄呬笂骞舵湭鐪熸h繍琛屻傜敱浜庡緢澶氲$畻链洪兘鏄鍗曞勭悊鍣ㄧ殑锛屾墍浠ヨ佸湪钖屼竴镞跺埢杩愯屾墍链夌殑澶勪簬鍙杩愯岀姸镐佺殑绾跨▼鏄涓嶅彲鑳界殑锛孞ava镄勮繍琛岀郴缁熷繀椤诲疄鐜拌皟搴︽潵淇濊瘉杩欎簺绾跨▼鍏变韩澶勭悊鍣ㄣ

3. 涓嶅彲杩愯岀姸镐侊纸Not Runnable锛
杩涘叆涓嶅彲杩愯岀姸镐佺殑铡熷洜链夊备笅鍑犳浔锛
1) 璋幂敤浜唖leep锛堬级鏂规硶;
2) 璋幂敤浜唖uspend锛堬级鏂规硶;
3) 涓虹瓑鍊欎竴涓𨱒′欢鍙橀噺锛岀嚎绋嬭皟鐢╳ait锛堬级鏂规硶;
4) 杈揿叆杈揿嚭娴佷腑鍙戠敓绾跨▼阒诲;
涓嶅彲杩愯岀姸镐佷篃绉颁负阒诲炵姸镐侊纸Blocked锛夈傚洜涓烘煇绉嶅师锲狅纸杈揿叆/杈揿嚭銆佺瓑寰呮秷鎭鎴栧叾瀹冮樆濉炴儏鍐碉级锛岀郴缁熶笉鑳芥墽琛岀嚎绋嬬殑鐘舵併傝繖镞跺嵆浣垮勭悊鍣ㄧ┖闂诧纴涔熶笉鑳芥墽琛岃ョ嚎绋嬨

4. 姝讳骸鐘舵侊纸Dead锛
绾跨▼镄勭粓姝涓鑸鍙阃氲繃涓ょ嶆柟娉曞疄鐜帮细镊铹舵挙娑堬纸绾跨▼镓ц屽畬锛夋垨鏄琚锅沧锛堣皟鐢╯top()鏂规硶锛夈傜洰鍓崭笉鎺ㄨ崘阃氲繃璋幂敤stop()𨱒ョ粓姝㈢嚎绋嬬殑镓ц岋纴钥屾槸璁╃嚎绋嬫墽琛屽畬銆

http://www.bc-cn.net/Article/kfyy/java/jc/200410/83.html

㈤ java中什么叫做线程什么叫多线程多线程的特点是什么

在 Java 中,线程(Thread)是指程序执行的一条路径,是进程中的一个实体。Java 中的线程是轻量级的,可以同时运行多个线程,这就是多线程(Multithreading)。

多线程是指在一个程序中同时运行多个线程,每个线程都可以独立执行不同的任务。多线程的特点包括:

  • 提高程序的并发性:多线程可以让程序同时执行多个任务,提高程序的并发性,从而提高程序的效率。

  • 提旅凯毁高程序的响应性:多线程可以让程序拆备在执行耗时操作时不会阻塞,从孙隐而提高程序的响应性,使用户能够更快地得到反馈。

  • 充分利用 CPU 资源:多线程可以让程序充分利用 CPU 资源,提高 CPU 的利用率,从而提高程序的效率。

  • 方便处理复杂的任务:多线程可以让程序同时处理多个复杂的任务,从而方便处理复杂的任务。

需要注意的是,多线程也会带来一些问题,例如线程安全问题、死锁问题等,因此在编写多线程程序时需要注意这些问题。

㈥ 安卓开发线程和进程讲解


本教程为大家介绍安卓开发中的线程和进程,安卓平台中当首次启动运行一个组件的时候,Android会相应的启动了一个进程。默认的,所有的组件和程序运行在这个进程和线程中,也可以安排组件在其他的进程或者线程中运行。
进程:组件运行的进程由manifest file控制。组件的节点activity, service, receiver, 和 provider 都包含一个 process 属性。这个属性可以设置组件运行的进程:可以配置组件在一个独立进程运行,或者多个组件在同一个进程运行。甚至可以多个程序在一个进程中运行——如果这些程序共享一个User ID并给定同样的权限。 节点也包含 process 属性,用来设置程序中所有组件的默认进程。
所有的组件在此进程的主线程中实例化,系统对这些组件的调用从主线程中分离。并非每个对象都会从主线程中分离。一般来说,响应例如View.onKeyDown()用户操作的方法和通知的方法也在主线程中运行。这就表示,组件被系统调用的时候不应该长时间运行或者阻塞操作(如网络操作或者计算大量数据),因为这样会阻塞进程中的其他组件。可以把这类操作从主线程中分离。
当更加常用的进程无法获取足够内存,Android可能会关闭不常用的进程。下次启动程序的时候会重新启动进程。
当决定哪个进程需要被关闭的时候, Android会考虑哪个对用户更加有用。如Android会倾向于关闭一个长期不显示在界面的旦颂歼进程来支持一个经常显示在界面的进程。
线程:即使为组件分配了不同的进程,有时候也需要再分配线程。比如用户界面需要很快对用户进行响应,因此某些费时的操作,如网络连接、下载或者非常占用服务器时间的操作应该放到其他线程。
线程通过java的标准对象Thread 创建. Android 提供了很多方便的管理线程的方法:— Looper 在线程中运行一个消息循环; Handler 传递一个消息; HandlerThread 创建一个带有消息循环的线程。
远程调用Remote procere calls
Android有一个远程调用(RPCs) 的轻量级机制— 通过这个机制,方法可以在本地调用,在远程执行(在其他进程执行),还可以返回一个值。要实现这个需求,必须分解方法调用,并且所有要传递的数据必须是操作系统可以访问的级别。从本地的进程和内存地址传送到远程的进程和内存地樱正址并在远程处理和返回。返回值必须向相反的方向传递。Android提供了做以上操作的代码,所以开发者可以专注于实现RPC的接口。
一个RPC接口只能包含方法。所有的方法都是同步执行的(直到远程方法返回,本地方法才结束阻塞),没有返回值的时候也是如此。
简单来说,这个机制是这样的:使用IDL (interface definition language)定义你想要实现的接口, aidl 工具可以生成用于java的接口定义,本地和远程都要使用这个定义。它包含2个类,
inner类包含了所有的管理远程程序(符合IDL描述的接口)所需要的代码。所有的inner类实现了IBinder 接口.其中一个在本地使用,可以不管它的代码;另外一个叫做Stub继承了 Binder 类。为了实现远程调用,这个类包含RPC接口。开发者可以继承Stub类来实现需要的方法。
一般来说,远程进程会被一个service管理(因为service可以通知操作系统这个进程的信息并和其他进程通信),它也会包含aidl 工具产生的接口文件,Stub类实现了远处那个方法。服务的客户端只需要aidl 工具产生的接口文件。
以下是如何连接服务和客户端调用:
·服务的客户端(本地)会实现onServiceConnected() 和onServiceDisconnected() 方法,这样,当客户端连接或者断开连接的时候可以获取到通知。通过 bindService() 获取到服务的连接。
· 服务的 onBind() 方法中可以接收或者拒绝连接,取决它收到的intent (intent通过 bindService()方法连接到服务). 如果服务接收了连接,会返回一个Stub类的实例.
· 如果服务接受了连接,Android会调用客户端的onServiceConnected() 方法,模冲并传递一个Ibinder对象(系统管理的Stub类的代理),通过这个代理,客户端可以连接远程的服务。
以上的描述省略很多RPC的机制。请参见Designing a Remote Interface Using AIDL 和 IBinder 类。
线程安全的方法
在某些情况下,方法可能调用不止一个的线程,因此需要注意方法的线程安全。
对于可以远程调用的方法,也要注意这点。当一个调用在Ibinder对象中的方法的程序启动了和Ibinder对象相同的进程,方法就在Ibinder的进程中执行。但是,如果调用者发起另外一个进程,方法在另外一个线程中运行,这个线程在和IBinder对象在一个线程池中;它不会在进程的主线程中运行。例如,一个service从主线程被调用onBind() 方法,onBind() 返回的对象(如实现了RPC的Stub子类)中的方法会被从线程池中调用。因为一个服务可能有多个客户端请求,不止一个线程池会在同一时间调用IBinder的方法。因此IBinder必须线程安全。
简单来说,这个机制是这样的:使用IDL (interface definition language)定义你想要实现的接口, aidl 工具可以生成用于java的接口定义,本地和远程都要使用这个定义。它包含2个类,
inner类包含了所有的管理远程程序(符合IDL描述的接口)所需要的代码。所有的inner类实现了IBinder 接口.其中一个在本地使用,可以不管它的代码;另外一个叫做Stub继承了 Binder 类。为了实现远程调用,这个类包含RPC接口。开发者可以继承Stub类来实现需要的方法。
一般来说,远程进程会被一个service管理(因为service可以通知操作系统这个进程的信息并和其他进程通信),它也会包含aidl 工具产生的接口文件,Stub类实现了远处那个方法。服务的客户端只需要aidl 工具产生的接口文件。
以下是如何连接服务和客户端调用:
·服务的客户端(本地)会实现onServiceConnected() 和onServiceDisconnected() 方法,这样,当客户端连接或者断开连接的时候可以获取到通知。通过 bindService() 获取到服务的连接。
· 服务的 onBind() 方法中可以接收或者拒绝连接,取决它收到的intent (intent通过 bindService()方法连接到服务). 如果服务接收了连接,会返回一个Stub类的实例.
· 如果服务接受了连接,Android会调用客户端的onServiceConnected() 方法,并传递一个Ibinder对象(系统管理的Stub类的代理),通过这个代理,客户端可以连接远程的服务。
线程安全的方法
在某些情况下,方法可能调用不止一个的线程,因此需要注意方法的线程安全。
对于可以远程调用的方法,也要注意这点。当一个调用在Ibinder对象中的方法的程序启动了和Ibinder对象相同的进程,方法就在Ibinder的进程中执行。但是,如果调用者发起另外一个进程,方法在另外一个线程中运行,这个线程在和IBinder对象在一个线程池中;它不会在进程的主线程中运行。例如,一个service从主线程被调用onBind() 方法,onBind() 返回的对象(如实现了RPC的Stub子类)中的方法会被从线程池中调用。因为一个服务可能有多个客户端请求,不止一个线程池会在同一时间调用IBinder的方法。因此IBinder必须线程安全。
简单来说,一个content provider 可以接收其他进程的数据请求。即使ContentResolver和ContentProvider类没有隐藏了管理交互的细节,ContentProvider中响应这些请求的方法(query(), insert(), delete(), update(), and getType() )— 是在content provider的线程池中被调用的,而不是ContentProvider的本身进程。因为这些方法可能是同时从很多线程池运行的,所以这些方法必须要线程安全。

热点内容
推荐类的算法 发布:2024-11-26 01:50:22 浏览:917
怎么制作ftp软件 发布:2024-11-26 01:45:41 浏览:567
算法m是谁 发布:2024-11-26 01:40:35 浏览:44
h1z1文件夹安装 发布:2024-11-26 01:40:28 浏览:23
电话加密 发布:2024-11-26 01:39:09 浏览:28
hotspot源码 发布:2024-11-26 01:33:05 浏览:282
日本电报密码是多少 发布:2024-11-26 01:33:00 浏览:441
雷电缓存目录 发布:2024-11-26 01:30:05 浏览:951
androidcanvas缩放 发布:2024-11-26 01:21:36 浏览:239
微信商家扫我为什么输入密码 发布:2024-11-26 01:20:40 浏览:661