1.线程和进程的区别:
线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
执行过程:每个独立的进程有程序运行的入口. 顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
4种。
public class MyThread extends Thread { public void run() { for(int i = 0; i < 10; i++) { System.out.println("MyThread"+getName()); } } }
public static void main(String[] args) throws InterruptedException { /** * 多线程的第一种启动方 * 1.定义一个类继承Thread * 2.重写run方法 * 3.创建子类对象启动线程 */ MyThread T1 = new MyThread(); MyThread T2 = new MyThread(); //开启线程.start() T1.setName("T1"); T2.setName("T2"); T1.start(); T2.start(); }
public class Run implements Runnable{ @Override public void run() { //实现线程要执行的代码 for(int i = 0; i < 10; i++) { System.out.println("MyThread"+Thread.currentThread().getName()+" "+i); } } }
/** * 多线程的第二种启动方 * 1.自己定义一个实现Runnable接口的类 * 2.重写run方法 * 3.创建自己的类 * 4.创建一个Tread类对像开启多线程 */ //创建Run的对象 //表示多线程要执行的人物 public static void main(String[] args) { Run r = new Run(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); }
public class Mycallable implements Callable{ @Override public Integer call() throws Exception { //求1~100d的和 int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } return sum; } }
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
CallerRunsPolicy:由调用线程处理该任务。
工作中核心线程数设置与CPU有关系,核心线程数=CPU数*2
但是这样创建不够灵活,可以通过ThreadPoolExecutor去创建线程池,需要设置7个参数,分别是:
1.核心线程池 2.最大线程数 3.空闲线程存活时间 4.存活时间单位 5.工作队列 6线程工厂 7.拒绝策略
拒绝策略有4种:
AbortPolicy:丢弃任务并且抛出异常。
DiscardPolicy:丢弃任务但是不抛出异常。
可以通过Executors类提供的方法创建线程池,有4种创建的方法:
创建一个可以缓存的线程池。
创建一个定长的线程池。
创建一个定长的,支持定时任务、周期任务执行的线程池。
创建一个单线程池。
工作中一般用线程池的方式来创建线程,方便线程的管理。比如SpringBoot中异步方式的执行,底层采用的就是线程池的方式。
新建状态:当线程对象创建后,进入新建状态。
就绪状态:当调用线程对象的start()方法时,进入就绪状态。
运行状态:当CPU开始调度就绪状态的线程时,进入运行状态。
堵塞状态:当运行的线程由于某些原因暂时放弃对CPU的使用权,进入堵塞状态。
死亡状态:当线程执行完毕或由于异常退出了run()方法,线程结束生命周期。
等待阻塞:运行状态的线程执行了wait()方法。
同步阻塞:线程在获取sync锁的时候失败。(因为锁被其他线程占用)
其他阻塞:通过调用线程的sleep()或者join()或发出了I/O请求时。