如果一个程序能够运行多个线程,那么这个程序式多线程的.每个任务在一个线程中执行,执行线程简称线程.
线程与进程的区别
- 进程是指在系统中正在运行的一个应用程序,它描述程序对网络,磁盘,内存,CPU等一系列的占用.
- 线程是进程内独立的单元,一个进程内有若干个线程,但至少有一个线程,一般称为主线程
实现线程的两种方式
- 建立Thread类的子类来定义线程,构造Tread类的子类的对象,调用start()方法.这种方法不建议使用,应当把运行任务与运行机制解耦.如果有多个任务,每个任务都需要创建一个单独线程,开销会太大.
- 实现Runnable接口,实现Runnable接口的类并不是一个线程类,重写run方法中定义了运行任务,通过Thread的类创建线程对象.
 实际上两种方式实现机制相同,Thread类是Runnable接口的实现类.Runnable的实现类定义了线程任务,Thread类是创建线程的机制.
线程的状态
- New(新建) 
 用new操作符创建一个新的线程时,线程未开始,在开始前做基础工作.
- Runnable(可运行) 
 可运行其实可以分解为:就绪态和运行态,就绪态意味着程序未运行,需要操作系统提供具体的运行时间.
 现在所有的桌面以及服务器操作系统都使用抢占式调度.
- Blocked(阻塞) 
- Waiting(等待) 
- Timed wating(计时等待) 
- Terminated(终止) 
基本方法
java.lang.Thread
- Thread(Runnble target)
 构造一个新线程,调用指定目标的run()方法
- void start()
 启动这个线程,从而调用run方法
 注意:不要调用Runnable对象或者Thread类中的run方法,直接调用run方法只会在同一个线程中执行这个任务,而没有启动多线程.实际上应当调用Thread.strat方法,这会创建一个执行run方法的新线程.
- static voidf sleep(long millis)
 休眠指定的毫秒数
- static void yield()
 使当前正在执行的线程向另个一线程交出执行权(转为就绪态)
- void join()
 等待终止指定的线程(等待子线程终止,主线程才能转为就绪)
- setPriority();
 设置线程优先级,10最大,1最小,默认为5
- currentThread()
 获取当前所执行的Tread类
- setName() getName()
 获取更改线程名
代码示例
使用sleep方法进行排序
package com.apescource.demo;
/*
 *Thread.sleep()方法示例
 */
public class Demo6 {
    public static void main(String[] args) {
        // 数字数组
        int[] numbers = { 3, 9, 4, 23, 12, 9, 14 };
        // 线程数组
        Thread[] threads = new Thread[numbers.length];
        // 线程数组与数字数组一一对应
        for (int i = 0; i < numbers.length; i++) {
            //创建所有的线程
            threads[i] = new Thread(new NumberThread(numbers[i]));
        }
        //线程全部进入就绪态
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
    }
}
class NumberThread implements Runnable {
    private int number;
    public NumberThread(int number) {
        this.number = number;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(number*100);  
            System.out.println(number);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}