线程:
定义不用多说,个人理解就是一条生产线(thread)
生产线可以有多条,可以几乎是同时进行生产,但是能源(cpu资源是有限的,可以通过时间片来轮转获得cpu使用权),
生产线有些时候并不需要能源(这里比喻为能源可能欠妥,姑且称之为 核能吧,用之不竭的能源),比如需要等待原材料补充(IO操作,耗时较长,但是与cpu无关系),补充完之后才能继续生产线,制造产品。而对于工厂而言,生产机器能一直运行最好(压榨cpu),可以带来更大的利益。
多线程就是在某一个线程不使用(暂时不使用)cpu的时候,将cpu给需要的线程,这样保证了cpu尽可能的忙。
测试代码:
/**
* 测试线程
*/
@Slf4j
class MyThread implements Runnable{
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public MyThread(int id){
this.id=id;
}
@Override
public void run() {
log.info("thread:{}",id);
}
}
@Slf4j
public class TestThreadPool {
@Test
public void testThreadPool(){
}
@Test
public void testThread(){
int threadCount=10;
//创建10个线程
List<MyThread> threads=new ArrayList<>();
for(int i=0;i<threadCount;i++){
MyThread temp=new MyThread(i);
threads.add(temp);
}
//等待所有线程启动完成
for(MyThread thread:threads){
// Causes this thread to begin execution; the Java Virtual Machine
// * calls the <code>run</code> method of this thread.
//start方法是让虚拟机去调用线程的run方法,会返回两个线程,
// 一个是调用线程的线程(也就是主线程),另一个是被调用的线程
//注意每个线程的start方法只能调用一次,执行完这个线程就结束了
new Thread(thread).start();
}
//测试发现主线程不会被堵塞,先输出“我是主线程" ,然后是乱序的 thread:*
log.info("我是主线程");
}
}
由测试结果可以看到:
1,start其他线程并不会阻塞主线程,反而是主线程先执行完
2,按照顺序start其他线程,但是实际执行顺序却不一定与代码start顺序一致(这点有时候让我苦恼,捉摸不透顺序)