线程
线程的一些主要状态以及状态之间的装换 (如下图)
主要状态为1.新建 2.就绪 3.运行4阻塞 5.死亡
其中:join()可以用来邀请其他线程先执行
yield()告诉系统"把自己的CPU时间让掉,让其他线程或者自己运行"
引入线程的好处:
1 创建一个线程花费的时间少
2 两个线程(在同一进程中的)的切换时间少。
3 由于同一个进程内
的线程共享内存和文件,所以线程之间互相通信不必调用内核。
4 线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力
线程池
当线程的执行时间远大于创建时间和销毁时间之和时,采用线程池不仅调整和缩短创建线程,销毁线程的时间,而且它还显著减少了创建线程的数目。
一般一个简单线程池至少包含下列组成部分。
1. 线程池管理器(ThreadPoolManager):用于创建并管理线程池
2.工作线程(WorkThread): 线程池中线程
3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
4.任务队列:用于存放没有处理的任务。提供一种缓冲机制。
如下例:
···自定义线程池类
···创建线程池管理器
//构造函数(自定义线程池)
public ThreadPool(int count){
this.count=count;
threadPool=new ThreadWork[this.count];
for(int i=0;i<this.count ;i++){
ThreadWork work=new ThreadWork();//创建一个工作线程
threadPool[i]=work;
threadPool[i].setName("创建第"+i+"号线程");
threadPool[i].start();
System.out.println("第"+i+"号线程开始运行");
}
}
//添加新任务
//执行任务的方法
public void excute(Runnable task){
synchronized(task_list){
//添加任务到等待队列中
task_list.addLast(task);
//通知
task_list.notify();
}
}
创建工作线程
//工作线程
private class ThreadWork extends Thread{
public void run(){
Runnable r;
while(true){
synchronized(task_list){
if(task_list.isEmpty()){//队列为空时,等待
try {
task_list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没执行完一次任务之后将该任务从等待就绪队列中删除
r=task_list.removeFirst();
}
r.run();//执行删除的操作
}
}
}
创建任务接口
package threadPool;
//自定义任务类
public class Task implements Runnable{
public void run() {
//输出当前正在执行的线程的名字
System.out.println(Thread.currentThread().getName()+"正在运行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
创建任务队列
//保存等待任务的队列
private LinkedList<Runnable> task_list=new LinkedList<Runnable>();