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:用户点击鼠标时,所激发的操作较费时。
同步调用:当用户再点击鼠标将不会立即反应,整个程序显得很沉重。
异步调用:借助异步调用处理费时的操作,让主线程随时恭候下一条消息,用户点击鼠标时感到轻松快捷,肯定会对软件产生好感。