1.多线程的目的:充分利用cpu资源,并发做多件事
2.线程什么时候让出cpu:
阻塞时 wait,await等待IO
sleep
yield
3.线程是什么:
一条代码执行流,完成一组代码的执行
这一组代码,我们往往成为一个任务
4.cpu执行代码
5.线程并不是越多越好
(1)线程在java中是一个对象,每个java线程都需要一个操作系统线程支持,线程的创建,销毁需要时间,如果线程的创建时间+ 销毁时间>执行任务时间,就很不合算
(2)java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈1M,这个栈空间需要从系统内存中分配
(3)操作系统需要频繁切换线程上下文(大家都想被运行),影响性能
6.多线程的目的:充分利用cpu并发做事,将代码交给cpu执行,合适数量的线程就构成了一个池
线程池:接收任务,放入队列,工作线程从队列中取出任务,执行,当没有任务时,线程阻塞,当有任务时,唤醒线程执行。
public class ThreadPoolManager {
//1.队列
private BlockingQueueblockingQueue;
//2.线程集合
private Listworkers;
public ThreadPoolManager(int taskSize,int threadSize){
blockingQueue =new LinkedBlockingQueue<>(taskSize);
workers = Collections.synchronizedList(new ArrayList());
for (int i =0; i < threadSize; i++) {
Worker worker =new Worker(this);
workers.add(worker);
worker.start();
}
}
//将任务放入队列中
public boolean addTask(Runnable runnable){
if (isShutDown)
return blockingQueue.offer(runnable);
else
return false;
}
//每个线程需要去干的活
public static class Workerextends Thread{
ThreadPoolManagermThreadPoolManager;
public Worker(ThreadPoolManager threadPoolManager){
this.mThreadPoolManager = threadPoolManager;
}
@Override
public void run() {
while (this.mThreadPoolManager.isShutDown||this.mThreadPoolManager.blockingQueue.size()>0){
Runnable runnable =null;
try {
if (this.mThreadPoolManager.isShutDown) {
runnable =mThreadPoolManager.blockingQueue.take();//以阻塞的方式拿
}else {
runnable =mThreadPoolManager.blockingQueue.poll();//不阻塞
}
}catch (InterruptedException e) {
e.printStackTrace();
}
if (runnable!=null){
runnable.run();
System.out.println("当前线程:"+Thread.currentThread().getName()+"执行了");
}
}
}
}
private volatile boolean isShutDown =true;
public void shutDown(){
isShutDown =false;
for (Thread worker :workers) {
if (worker.getState().equals(Thread.State.BLOCKED))
worker.interrupt();
}
}
}
网友评论