動手實現線程池demo
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
* @author senninha
* 線程池demo
*/
public class ThreadPollTest {
private LinkedList<Job> jobs;
private List<Worker> workers;
private final int THREAD_NUMS = 10;
private AtomicInteger threadName = new AtomicInteger(0);
public ThreadPollTest(LinkedList<Job> jobs, List<Worker> worker) {
super();
this.jobs = jobs;
this.workers = worker;
initThreadPools();
}
private void initThreadPools() {
for (int i = 0; i < THREAD_NUMS; i++) {
Worker worker = new Worker(jobs);
Thread t = new Thread(worker, "線程" + threadName.getAndIncrement());
workers.add(worker);
t.start();
}
}
public void submit(Job job) {
synchronized (jobs) {
jobs.addLast(job);
jobs.notifyAll();
System.out.println("通知線程蘇醒");
}
}
public void shutdown() {
for(int i = 0 ; i < THREAD_NUMS ; i++){
workers.get(i).shutdown();
}
synchronized (jobs) {
jobs.notifyAll();
System.out.println("喚醒所有線程,讓他們停止");
}
}
//程序入口
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<Job> jobs = new LinkedList<>();
List<Worker> worker = new ArrayList<Worker>();
ThreadPollTest tpt = new ThreadPollTest(jobs, worker);
Job0 job0 = new Job0();
Job1 job1 = new Job1();
tpt.submit(job0);
try {
Thread.sleep(10000);
System.out.println("休眠10s后提交job1");
tpt.submit(job1);
Thread.sleep(10000);
System.out.println("休眠10s后停止線程池");
tpt.shutdown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @author senninha
* 工作線程
*/
class Worker implements Runnable {
private LinkedList<Job> jobs;
private AtomicBoolean run = new AtomicBoolean(true);
public Worker(LinkedList<Job> jobs) {
this.jobs = jobs;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (run.get()) {
synchronized (jobs) {
if (jobs.size() == 0) {
try {
System.out.println("線程:" + Thread.currentThread().getName() + "在等待");
jobs.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
} else {
jobs.removeFirst().run();
}
}
}
System.out.println("線程" + Thread.currentThread().getName() + " 結束");
}
public void shutdown() {
run.set(false);
}
}
/**
* 提交任務
* @author senninha
*
*/
interface Job {
public void run();
}
/**
* 繼承Job實現線程任務
* @author senninha
*
*/
class Job0 implements Job{
@Override
public void run(){
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "完成了job0");
}
}
class Job1 implements Job{
@Override
public void run(){
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "完成了job1");
}
}