背景:线程可以独立运行某些代码,时间消耗少,但是cpu消耗大;创建一个线程消耗非常大,有没有可能创建一定数量的线程放到一个固定数量的容器中,没有任务处理时,线程处于等待状态,需要处理任务时,就取一个线程出来,用完又放回去。根据这个,我们来模拟线程池
一、自定义线程池
MyTask类:任务类,处理具体任务
WorkerThread类:工作线程类,获取到工作,就处于运行状态;没有任务,就处于等待状态
ToolThread类:线程池类,有任务就分配任务的类
ThreadTest类:测试类
代码如下:
package com.test.exercise1;
/**
* 任务类
*
* @author lhz
*
*/
public class MyTask {
private String name;
public MyTask(String name) {
this.name = name;
}
/**
* 任务要做什么
*/
public void work() {
System.out.println(name + "开始执行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "执行完毕");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.test.exercise1;
import java.util.ArrayList;
/**
* 任务执行者类
*
* @author lhz
*
*/
public class WorkerThread extends Thread {
// 任务列表
private ArrayList<MyTask> list;
public WorkerThread(ArrayList<MyTask> list) {
this.list = list;
}
public void run() {
while (true) {
synchronized (list) {
if (list.isEmpty()) {// 任务列表为空
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyTask task = list.remove(0);// 取出一个
System.out.println(this.getName() + "正在执行" + task.getName());
task.work();
}
}
}
package com.test.exercise1;
import java.util.ArrayList;
/**
* 线程池
*
* @author lhz
*
*/
public class ToolThread extends Thread {
private ArrayList<MyTask> list;// 任务列表
// private MyTask[] task;// 任务数组
public ToolThread(int size) {// 执行者的数量
list = new ArrayList<MyTask>();
// task = new MyTask[size];
// 初始化任务执行者
for (int i = 0; i < size; i++) {
WorkerThread wt = new WorkerThread(list);
wt.setName("任务执行者" + i);
wt.start();
System.out.println(wt.getName() + "正在等待任务");
}
System.out.println("所有任务执行者正在等待任务");
}
/**
* 分配任务,将任务加入到任务列表
*/
public void excute(MyTask mt) {
// 通知执行者
synchronized (list) {
list.add(mt);
list.notify();
}
}
}
package com.test.exercise1;
/**
* 测试
*
* @author lhz
*
*/
public class MyTest {
public static void main(String[] args) {
ToolThread tt = new ToolThread(5);
for (int i = 0; i < 20; i++) {
MyTask mt = new MyTask("任务" + i);
tt.excute(mt);
}
}
}
二、JDK内置的线程池
java.util. concurrent包:
JDK1.5起,引入的包,这个包下是关于并发编程使用的类库
java.util.concurrent.ExecutorService
//使用JDK内置的线程池,创建具有5个内置线程的池
ExecutorService exec = Executors.newFixedThreadPool(5);
//创建50个任务
for(int index = 0; index < 50; index++) {
SamplTask st=new SamplTask();
//开始执行
exec.execute(st);
}
//执行完任务后再关闭线程池,
exec.shutdown();
线程非常用方法:
currentThread() 返回当前运行的Thread对象。
stop() 使调用它的线程立即停止执行,永远不要调用这个方法。
suspend() 使线程挂起,暂停运行。
resume() 恢复挂起的线程,使其处于可运行状态(Runnable)。
yield() 将CPU控制权主动移交到下一个可运行线程。
setPriority() 设置线程优先级。
getPriority() 返回线程优先级。
setName() 设置线程的名字。
getName() 返回该线程的名字。
isAlive( ) 如果线程已被启动并且未被终止,那么isAlive( )返回true。如果返回false,
三、线程状态