java多线程(一)

一、进程,线程,并发,并行
1.1 进程和线程的区别
      进程是指:一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
        线程是指,进程里的一个执行流程,一个进程可以包含多个线程。比如一个java.exe(进程)可以运行多个线程,线程总是属于某个进程,多个线程之间共享进程的内存。
        多线程:指的是这个程序(一个进程)运行时产生了不止一个线程
 
1.2并发和并行的区别:
     并发,是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序:

 

     并行,是每个cpu运行一个程序:

      

二、线程的周期和五种状态
 
线程的生命周期 :

 

 
2.1新建状态(new):当线程被创建后,处于新建状态,如 Thread t1 = new MyThread();
2.2就绪状态(Runnable):当调用线程的star()方法时,进入就绪状态。处于就绪状态表示,线程已经准备好,随时等候cpu调用。
2.3运行状态(Running):当cpu开始调度处于就绪状态的线程时,线程才得以执行,进入运行状态。就绪状态是线程进行到运行状态的唯一途径。
2.4阻塞状态(Blocked):处于运行时状态的线程出于某些原因暂时放弃对cpu的使用权,暂停被执行,此时进入阻塞状态,知道阻塞状态变回就绪状态,才有机会被cpu调度重新进入运行状态。根据阻塞的原因的不同,可以分为3种不同的阻塞状态:
a. 等待阻塞:运行中的线程执行wait()方法进入到阻塞状态;
b. 锁定阻塞:线程在获取同步锁失败时(因为同步锁被其他线程占用),它会进入到锁定阻塞状态;
c. 其他阻塞 : 通过调用线程的sleep(),join(),或者发出I/O请求时,线程会进入到阻塞状态。当线程调用 sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
2.5.死亡状态(Dead):当线程正常结束或者异常退出时,线程进入死亡状态。线程的生命周期结束。
 
 

 

 
 
三、多线程的创建和启动(第一第二中比较常用)
3.1 继承Thread类,重写该类的run()方法。
 MyThread.java
 1 /**
 2  * 实现Thread类并重写run方法
 3  * @author luke
 4  *
 5  */
 6 public class MyThread extends Thread {
 7     private int i = 0;
 8     
 9     @Override
10     public void run() {
11         for (int i = 0; i < 100; i++) {
12             System.out.println(Thread.currentThread().getName() + "," + i);
13         }
14     }
15 }
View Code

Client.java测试类

 1 package com.asiainfo.test.thread;
 2 
 3 
 4 /**
 5  * 测试类
 6  * @author hasee
 7  *
 8  */
 9 public class Client {
10     public static void main(String[] args) {
11         for (int i = 0; i < 100; i++) {
12              System.out.println(Thread.currentThread().getName() + " " + i);
13              if(i == 30) {
14                  Thread myThread1 = new MyThread();//创建一个新的线程,这时的状态为new
15                  Thread myThread2 = new MyThread();//创建一个新的线程,这时的状态为new
16                  myThread1.start();
17                  myThread2.start();
18              }
19         }
20     }
21 }
View Code

 

3.2 实现Runnable接口,并重写该接口的run()方法
MyRunnalbe.java
 1 package com.asiainfo.test.thread2;
 2 
 3 /**
 4  * 多线程,通过实现Runnable接口,重写run方法
 5  * @author hasee
 6  *
 7  */
 8 public class MyRunnalbe implements Runnable {
 9     private int i = 0;
10     
11     /**
12      * 线程执行体,描述线程需要完成的任务。
13      */
14     @Override
15     public void run() {
16         for (int i = 0; i < 100; i++) {
17             System.out.println(Thread.currentThread().getName() + "," + i);
18         }
19     }
20 
21 }
View Code

RunnableTest.java测试类

 1 package com.asiainfo.test.thread2;
 2 
 3 /**
 4  * 测试类
 5  * @author hasee
 6  *
 7  */
 8 public class RunnableTest {
 9     public static void main(String[] args) {
10         for (int i = 0; i < 100; i++) {
11             System.out.println(Thread.currentThread().getName() + "," + i);
12             if(i == 30) {
13                 MyRunnalbe runnable = new MyRunnalbe();//创建一个runnable的实现类
14                 Thread t1 = new Thread(runnable);//将runnable作为入参Thread 入参target创建新的线程
15                 Thread t2 = new Thread(runnable);
16                 t1.start();
17                 t2.start();
18             }
19         }
20     }
21 }
View Code
3.3 使用Callable和Future接口创建线程
 

posted on 2017-02-04 02:48  lukelin1989  阅读(169)  评论(0编辑  收藏  举报

导航