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
View Code
View Code
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 }
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 }
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 }
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 }
3.3 使用Callable和Future接口创建线程
posted on 2017-02-04 02:48 lukelin1989 阅读(169) 评论(0) 编辑 收藏 举报