参考:http://lavasoft.blog.51cto.com/62575/99150
http://blog.csdn.net/baby_newstar/article/details/6783752
http://www.runoob.com/java/java-multithreading.html
1.操作系统中的进程和线程
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。
2.java中的线程
一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。
其他线程通过使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。
线程又分用户线程和守护线程。只有通过设置setDaemon(true)的线程才是守护线程。用户线程的生命周期由该线程自定义,比如while(true)一直执行。守护线程的生命周期是由创造它的线程决定的,父线程死掉了,它也就立即死亡而不管是否有任务还没有执行。抽象的理解就是:守护线程是工蜂,蜂后死掉后也会跟着死掉。
3.线程的生命周期
- 新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
- 就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
- 运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
- 阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。
- 死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
- 如图:
4.创建一个线程
Java提供了两种创建线程方法:
- 通过实现Runable接口;
- 通过继承Thread类本身。
1、如果是扩展java.lang.Thread类的线程,则直接new即可。
2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
4.1实现Runnable接口
package com.test.java.thread; /** * 学习线程 * Created by mrf on 2016/2/25. */ public class NewThread implements Runnable{ Thread thread; NewThread(){ //创建第二个新线程 thread = new Thread(this,"Demo Thread"); System.out.println("我是实现Runnable接口的类,我被创建了。而且我开始创建另一个线程(name,priority,groupname):"+thread); thread.start(); } //第二个线程入口 @Override public void run() { System.out.println("------------------我是实现Runnable接口的运行入口,我要开始运行了。-----------------------"); try { for (int i = 0; i < 5; i++) { System.out.println("Child Thread:"+i); //暂停线程 Thread.sleep(50); } } catch (InterruptedException e) { System.out.println("Child interrupted"); e.printStackTrace(); } System.out.println("---------------我这个线程就要运行结束了.------------------------"); } } class ThreadDemo{ public static void main(String[] args) { System.out.println("===========main线程开始运行。=============="); System.out.println("当前运行的是main线程:"+Thread.currentThread()); new NewThread();//创建一个新线程 try { for (int i =0; i<5; i++){ System.out.println("main thread:"+i); Thread.sleep(100); } } catch (InterruptedException e) { System.out.println("main thread interruped."); e.printStackTrace(); } System.out.println("==============main线程运行结束.================"); } }