java线程.doc_java多线程编程.doc

41528d3028836879cd698677c3999917.gifjava多线程编程.doc

JAVA多线程编程1.程序、进程和线程程序:程序是一段静态的代码;源程序,目标程序进程:进程是程序的一次动态的执行过程;加载到系统中的程序,获得CPU等资源得系统到执行。WindowsOS的任务管理器能看到在系统中的进程。进程与多任务操作系统:共用式多任务操作策略;抢占式多任务操作策略;操作系统中的多个进程之间的切换。按共用式多任务操作策略或抢占式多任务操作策略分配给各进程CPU资源线程:线程是比进程更小的执行单位;、每个Java进程都有一个主线程。从main()开始,由JVM创建。其它线程由主线程创建。如果主线程没有创建其它线程,那么该程序进程中就只有一个线程,此时线程与进程为一个实体。如果在主线程中创建了其他线程,那么JVM要在主线程和其他线程之间切换运行,保证每个线程都有机会获得CPU资源,并且和主线程具有同等地位。main()即使执行到最后一句,JVM也不会结束程序执行,直到所有线程都结束之后,才结束Java应用程序。进程中的多个线程之间的切换。按优先级策略分配给各线程CPU资源多线程是这样一种机制,它允许在程序中并发(cocrruent)执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。具体到java内存模型,由于Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。系统存在一个主内存(MainMemory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(WorkingMemory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,将会带来线程调度,同步等问题。2、单线程程序例子classhello1{voidm1(){booleanb=true;while(b){System.out.println(“Hello!“);}}voidm2(){booleanb=true;while(b){System.out.println(“World!“);}}publicstaticvoidmain(String[]aa){hello1h1=newhello1();h1.m1();h1.m2();}}3、在Java中实现多线程方法1:继承Thread类.继承Thread类,重写方法run(),我们在创建的Thread类的子类中重写run(),加入线程所要执行的代码即可。下面是一个例子:classhello{booleanb=true;classT1extendsThread{//voidm1()publicvoidrun(){while(b){System.out.println(“Hello!Hello!Hello!“);}}}classT2extendsThread{//voidm2()publicvoidrun(){while(b){System.out.println(“World!“);}}}voidmm(){T1t1=newT1();t1.start();T2t2=newT2();t2.start();}publicstaticvoidmain(String[]aa){helloh1=newhello();h1.mm();}}*/这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承,则无法再继承Thread类。方法2:实现Runnable接口Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,我们还必须创建Thread类的实例,这一点通过Thread类的构造函数publicThread(Runnabletarget);来实现。下面是一个例子:/*classhello{booleanb=true;classT1implementsRunnable//extendsThread{//voidm1()publicvoidrun(){while(b){System.out.println(“Hello!Hello!Hello!“);}}}classT2implementsRunnable//extendsThread{//voidm2()publicvoidrun(){while(b){System.out.println(“World!“);}}}voidmm(){T1t1=newT1();Threadtt1=newThread(t1);tt1.start();T2t2=newT2();Threadtt2=newThread(t2);tt2.start();/*T1t1=newT1();t1.start();T2t2=newT2();t2.start();*/}publicstaticvoidmain(String[]aa){helloh1=newhello();h1.mm();}}*/Chatroom使用Runnable接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装下面让我们一起来研究一下多线程使用中的一些问题。方法3:实现Callable接口。Java1.5提供了功能更强大的Callable和Future接口来实现多线程。importjava.util.concurrent.*;classCThreadimplementsCallable{publicIntegercall(){inti=0;for(;itask=newFutureTask(ct);for(inti=0;i<10;i++){System.out.println(Thread.currentThread().getName()+“的循环变量i的值“+i);if(i==5)newThread(task,“有返回值的线程“).start();}try{System.out.println(“子线程的返回值:“+task.get());}catch(Exceptione){e.printStackTrace();}}}4、线程的状态1、新状态:线程已被创建但尚未执行(start()尚未被调用)。2、可执行状态:线程可以执行,虽然不一定正在执行。CPU时间随时可能被分配给该线程,从而使得它执行。3.运行状态:得到CPU资源,正在执行3、阻塞状态:线程没有被分配CPU时间,无法执行;可能阻塞于I/O,或者阻塞于同步锁。4、死亡状态:正常情况下run()返回使得线程死亡。调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值