如果一个程序能够运行多个线程,那么这个程序式多线程的.每个任务在一个线程中执行,执行线程简称线程.
线程与进程的区别
- 进程是指在系统中正在运行的一个应用程序,它描述程序对网络,磁盘,内存,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();
}
}
}
网友评论