我对进程、线程、异步、同步的理解

来源:互联网 发布: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:用户点击鼠标时,所激发的操作较费时。

同步调用:当用户再点击鼠标将不会立即反应,整个程序显得很沉重。

异步调用:借助异步调用处理费时的操作,让主线程随时恭候下一条消息,用户点击鼠标时感到轻松快捷,肯定会对软件产生好感。
原创粉丝点击