`
heimeiyingwang
  • 浏览: 94180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

corejava辅导(11--1)

阅读更多

Java多线程编程

 

进程,即运行中的程序,多任务操作系统中并发的一个任务(CPU是分时间片执行多个进程的),线程,其本质是进程中顺序的执行流程,进程有独立的进程空间进程中的数据存放空间(对空间和栈空间)是独立的。线程没有独立的存放数据的空间,数据存储空间(堆空间)是共享的,线程间的栈空间是独立的,线程消耗的资源比进程小。

 

线程,是进程(运行中的程序)中顺序的执行流程,进程可以划分出多个线程。

 

JVMjava虚拟机)本身就是一个进程,java只能够申请创建线程。

 

操作系统决定线程是否有优先级,独占式的操作系统中系统会有优先级的概念,共享式的操作系统则不会优先级的。

 

Java中的线程也是对象,线程类是Thread类,线程是操作系统创建并进行维护的资源,线程对象表示一个线程,本身不是线程。通过线程对象来申请创建,中止线程,访问底层的线程资源。

 

线程包含了三部分,cpu资源,代码,数据存储空间。

 

线程对象调用start()方法,线程对象就会向操作系统申请线程启动,除了申请的线程,还有main方法的线程,也就是主线程。

 

注意:只有运行状态的线程才有机会执行代码,主线程的中止不会影响其他的正在运行中的线程,朱线程中止也就是main()方法退出了。只有进程中的所有线程都中止时,进程(JVM进程)才会退出,只要有线程没有中止,进程就不会退出。

 

线程编程的两种方法

1,  写一个类,继承Thread类,覆盖Thread类中继承来的run()方法,这样就写好了自定义的线程类。

例:

public class Test{

public static void main(String[] args){

Thread t=new A();

t.start();

}

class A extends Thread{

     public void run(){

         ...

     }

}

 

2,写一个类,实现Runable接口,实现其中的run()方法。这种方法写好的类的对象需要作为线程类创建对象时构造方法的参数。

例:

public class Test{

public static void main(String[] args){

Runable r=new b();//目标对象

Thread t=new Thread(r);//用目标对象构造线程对象

t.start();

}

 

class b implements Runable{

     public void run(){

         ...

     }

}

 

Thread类的方法

 

public static void sleep(long millis)

                  throws InterruptedException

括号中以毫秒为单位, 使线程停止一段时间,间隔期满后,线程不一定立即恢复执行。

main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。

     try{

         Thread.sleep(1000);

     }catch(InterruptedException e){

         e.printStackTrace(e);

     }

 

public final void join() throws InterruptedException

表示其他运行线程放弃执行权,进入阻塞状态,直到调用线程结束。

实际上是把并发的线程变为串行运行。

 

线程的优先级1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,因为不同操作系统的优先级并不相同,使得程序不具备跨平台性,这种优先级只是粗略地划分)。

注:程序的跨平台性:除了能够运行,还必须保证运行的结果。

 

Public static void field()

使当前线程马上交出执行权,回到可运行状态,等待OS的再次调用。

 

Public final Boolean isActive()

验证当前线程是否是活动的,不管它是否正在运行。

 

线程的生命周期

 

下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将锁池等待池都看成是阻塞状态的特殊情况:这种认识也是正确的,但是将锁池等待池单独分离出来有利于对程序的理解)

  

                             阻塞

                                                   结束


                                                                 

⑴          run()方法运行结束

 

 

                                                                        

                                         

                                             

                                                  

                          start() 

OS分配CPU

 

                          可运行

   CPU时间片结束                运行        

                                                     或调用yield()       

                                                                                 o.wait()

 

   等待锁标记

 

 

                                                                                           o.notify()

 

 

 

1, 初始状态,线程创建,线程对象调用start()方法。

2可运行状态,也就是等待Cpu资源,等待运行的状态。

3运行状态,获得了Cpu资源,正在运行状态。

4阻塞状态,也就是让出Cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。

1)如等待输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。

2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。

3)线程对象2调用线程对象1join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止

5中止状态,线程执行结束。所有线程都进入中止状态Java虚拟机进程才结束。

6锁池状态

7等待队列

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics