我对进程、线程、异步、同步的理解
来源:互联网 发布:java获取每月第一天 编辑:程序博客网 时间:2024/05/02 02:11
1. 进程和线程的区别
我的理解进程是一个正在执行的程序,正如我们在任务管理器中看到的一样,如图1-1,一个记事本、一个word文档、一个打开的网页就是一个进程,线程我们在这里看不到的。不过在eclipse中的debug窗口可以看到Thread。我是这样看待进程与线程的,一个进程来做一系列事情,我分为S1~S4,在没有线程前,进程需要依次做S1、S2、S3、S4,引入线程后,我们可以让线程T1~T4分别去完成S1~S4,具体怎么调度的,这里不说。如果是单核的机器,T1、T2、T3、T4不能同时执行,只能一个一个的去做,看起来跟一个进程相比,没有什么优化,但是如果采用好的调度算法,还是可以优化的。如果是多核的机器,优化可就大了,相当于把一个人做的事情分给多个人去做。
一个进程:
引入线程:
2.java异步编程。
当程序加载到内存时,启动主线程,要加载其他程序,就要使用Runnable接口和Thread类。
Runnable接口:改接口只声明了一个run方法,run是线程执行的起点。一个线程对象必须实现run方法完成线程的所有活动。
Thread类:将Runnable接口中的run方法实现为空方法。
Ps:在程序中,线程语句的顺序只决定了线程语句产生的顺序,线程产生后并不立即运行,而是和系统中的所有其他线程一起等待系统来执行它。这时所有线程执行的机会是均等的。所以这些线程的执行顺序由系统调度和控制,不由程序决定。创建线程有两种方法:(1)继承Thread类(2)实现Runnable接口
例子:
分别打印出a与b各10次,每打印一次a睡1s。打印一次b睡2秒
程序如下:
(1)实现Runnable接口的类
publicclass T implements Runnable{
String s="";
inttime=0;
publicvoid run(){
for(int i=0;i<10;i++){
try{
Thread.sleep(time);
}catch(InterruptedException e){
Thread.interrupted();
}
System.out.println(s);
}
}
}
(2)
publicclass Test {
publicstaticvoid main(String[] args){
T t1=new T();
T t2=new T();
t1.s="a";
t1.time=1000;
t2.s="b";
t2.time=2000;
Thread a=new Thread(t1);
a.start();
Thread b=new Thread(t2);
b.start();
}
}
这段代码,main是主线程,a与b是子线程。
运行结果
a
a
b
a
a
b
a
b
a
a
a
b
a
a
b
b
b
b
b
b
看着这个结果,我开始就问,为什么不是2个a,1个b的间隔,就是下面的间隔
a
a
b
a
a
b
a
a
b
a
a
b
a
a
b
b
b
b
b
b
细想下就知道,假如两个线程同时开始,过了1s后打印出一个a,再过1s,可以打印出a,也可以打印出b,两个线程调度是随机的。
3.异步调用与同步调用对比的好处
异步调用:就是你喊你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了。
同步调用:就是你喊你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去。
场景1:某个程序启动后需要打开文件读出其中的数据,再根据这些数据进行一系列初始化处理,然后显示给用户看
同步调用:用户要等到初始化处理完,返回结果才能看到,在这之前程序主窗口将迟迟不能显示,让用户感到这个程序怎么等半天也不出来,太差劲了。
异步调用:把整个初始化处理放进一个单独线程,主线程启动此线程后接着往下走,让主窗口瞬间显示出来。等用户盯着窗口犯呆时,初始化处理就在背后悄悄完成了。
场景2:用户点击鼠标时,所激发的操作较费时。
同步调用:当用户再点击鼠标将不会立即反应,整个程序显得很沉重。
异步调用:借助异步调用处理费时的操作,让主线程随时恭候下一条消息,用户点击鼠标时感到轻松快捷,肯定会对软件产生好感。- 我对进程、线程、异步、同步的理解
- 我对java线程同步的理解
- 对Silverlight同步与异步编程之我的理解
- 对同步异步的理解
- 对进程线程同步互斥的理解
- 对进程线程同步互斥的理解
- 线程进程/同步异步
- 对线程同步的理解
- 对Ajax同步异步的理解
- 我理解的异步与线程
- 对进程和线程的简单理解
- 对进程、线程、应用程序域的理解
- 对进程、线程、应用程序域的理解
- 我理解的进程与线程
- 【pthread系列-1】同步异步线程进程的一些思考
- 我对进程用户ID的理解
- 我对线程组的理解
- 我对python线程池的理解
- java.lang.NoClassDefFoundError: junit.framework.TestCase
- MySQL Workbench “Error Code: 1175” 的解决方法 (正确记录)
- 清空Task的Back Stack
- debian下安装nginx
- linux设备树dts移植详解
- 我对进程、线程、异步、同步的理解
- c#桌面应用程序资料收集
- 报错详解
- Storm数据流模型的分析及讨论
- Starting sendmail: 451 4.0.0 /etc/mail/sendmail.cf: line 91: fileclass: cannot open '/etc/mail/local
- opencv 学习第六天 通道的分离
- Masm First Program
- cstring与char *的转化
- 分页存储过程 sql