Java多线程开发一、二、三、四

转:-----------------http://softstone.javaeye.com/blog/172911

一、进程、线程
        进程通常是一个程序的实例。但进程是不活动的,必须有一个线程,线程负责执行地址空间中的进程代码。一个进程可以同时运行多个线程,每个线程拥有自己的堆栈、 CPU 寄存器和 CPU 时间。多个线程共享进程占有的资源,比如地址空间、动态内存、文件等。
        Java 虚拟机中线程可以粗略的如下表示:
     
      Java Virtual Machine ------------------|-----Thread1---->Local Variables
                                                              |----- Thread1---->Local Variables
      Global Memory································· |----- Thread1---->Local Variables

  可以看到,每个线程有自己的本地变量,同时也共享在 Java 虚拟机中的全局存储。

 

 

二、创建线程

Java中创建线程又两种方式,一种是继承Thread类,一种是实现Runnable接口。对于Thread的继承类,直接new即可,对于Runnable的实现类,用这个接口的实现类来new一个线程。
代码示例如下:
//继承Thread类
public class FirstThread extends Thread {
 
       // 需要继承run方法
       public void run() {
              try {
                     for (int i = 0; i < 20; i++) {
                            sleep(500);
                            System.out.println(getName());
                     }
              } catch (InterruptedException e) {
                     // 处理线程被终止的情况
                     e.printStackTrace();
              }
 
       }
}
 
//实现Runnable接口
public class SecondThread implements Runnable {
       //Runnable 接口只有一个run方法,必须实现。
       public void run() {       
              try {
                     for (int i = 0; i < 20; i++) {
                            Thread.sleep(400);
                            System.out.println(Thread.currentThread().getName());
                     }
              } catch (InterruptedException e) {
                     // 处理线程被终止的情况
                     e.printStackTrace();
              }
       }
 
}
 
//执行线程
              FirstThread t1 = new FirstThread();
              t1.setName("thread1");
              FirstThread t2 = new FirstThread();
              t2.setName("thread2");
              SecondThread r1 = new SecondThread();
              Thread t3 = new Thread(r1);
              Thread t4 = new Thread(r1);
              t3.setName("thread3");
              t4.setName("thread4");
             
              t1.start();
              t2.start();
              t3.start();
              t4.start();

需要注意,线程的执行必须使用start方法。

 

 

三、线程和对象
在Java中,创建线程是通过创建一个线程对象实现的,这就容易让人混淆,线程和对象有什么关系吗?其实两者之间没有关系。
线程是一个动态的概念,一个执行的概念,在Java虚拟机中,线程可以看作是一组语句的执行序列。
对象是一种封装方式,在Java中,一切都是对象,线程也需要通过对象来表达。Thread class也仅仅是一个对象,可以被其他的线程对象引用,其中的方法既可以被自身表达的线程所执行,也可以被其他的线程所执行。

四、线程的生命周期

线程生命周期

 

 

该图截自 sun 网站

线程启动:调用 start ()方法启动线程

线程运行:线程启动后运行 run ()方法体内代码

线程阻塞:线程 sleep() wait

线程结束:自让运行完毕退出。

 

   

线程的终止
两种终止方法。
一种是自然终止,run方法执行完退出。比如:
    public void run( ) {


 
        while (!done) {


            ...


 
        }


    }



另一种是调用Thread.interrupt()方法,中断wait()或Sleep方法,终止线程。
       public void run() {       
              try {
                     for (int i = 0; i < 400; i++) {
                            Thread.sleep(400);
                            System.out.println(Thread.currentThread().getName());
                     }
              } catch (InterruptedException e) {
                     // 处理线程被终止的情况
                     e.printStackTrace();
              }
       }
Thread.interrupt() 方法会导致sleep、join或wait等方法抛出InterruptedException异常,在catch InterruptedException的方法中,退出线程,但是线程在执行任务的时候是不会抛出InterruptedException。
 
其他两个方法
Thread.interrupted()
检查线程的中断状态,同时清除中断状态。
Thread.isInterrupt()
检查当前线程是否出于中断状态。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章