广告网站怎么做,口碑优化,企业建设有限公司,2345网址大全电脑版线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中#xff0c;是进程中的实际运作单位。简单理解为#xff1a;引用软件中相互独立#xff0c;可以同时允许的功能
进程是程序的基本执行实体
并发#xff1a;在同一时刻#xff0c;有多个指令在单个CPU上交替…线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中是进程中的实际运作单位。简单理解为引用软件中相互独立可以同时允许的功能
进程是程序的基本执行实体
并发在同一时刻有多个指令在单个CPU上交替执行
并行在同一时刻有多个指令在多个CPU上同时执行
多线程的实现方式
继承Thread类的方式进行实现实现Runnable接口进行实现利用Callable接口和Future接口的方式实现
方式一
//将类声明为Thread类的子类重写Thread类的run方法。
class MyThread() extends Thread{public void run(){//这里书写要执行的代码System.out.print(hello,xun);//System.out.print(getName())//获取当前线程的线程名}
}MyThread mythread new MyThread();
mythread.start();//启动线程mythread.setName(线程一)//给线程起名字方式二
//声明实现Runnable接口的类该类实现run方法。
class MyThread() implements Runnable{public void run(){//这里书写要执行的代码System.out.print(hello,xun);//获取当前线程对象Thread t Thread.currentThread();t.getName();//获取当前线程的线程名}
}
//表示多线程要执行的任务
MyThread mythread new MyThread();
//创建线程对象
Thread t new Thread(mythread);
//开启线程
t.start(); t.setName(线程一)//给线程起名字方式三
//利用Callable接口和Future接口的方式实现
//特点可以获取到多线程运行的结果
class MyCallable implements CallableInteger{//该线程返回值的类型public Integer call() throws Exception{//求1—100之间的和int sum0;for(int i 1;i100;i){sumi;}return sum;}
}
//创建MyCallable的对象(表示多线程要执行的任务)
MyCallable mc new MyCallable();
//创建FutureTask的对象(作用是管理多线程的运行结果)
FutureTaskInteger ft new FutureTask(mc);
//创建线程的对象
Thread t new Thread(ft);
t.start();
//获取多线程的运行结果
Integer res ft.get();多线程中常用的成员方法 如果我们没有给线程设置名字线程也是有默认名字的格式Thread-XX是序号从0开始如果给线程设置名字有两种方法1.通过setName设置线程名 2.通过构造函数设置线程名当JVM虚拟机启动后会自动运行多条线程其中有一条线程叫main线程他的作用就是调用main方法执行里面的代码线程的优先级最小的是1最大的10默认是5优先级越大抢到CPU的概率越大当其他的非守护线程执行完毕之后守护线程会陆续结束(可能不会将自己的程序运行完)t.join()//表示将线程t插入到当前线程之前 线程的声明周期 线程安全问题
线程的执行有随机性这样会导致线程存在安全问题
解决方法
同步代码块把操作共享的代码锁起来
synchronized(锁对象){//操作共享的代码块
}
//特点一锁默认打开有一个线程进去了锁自动关闭
//特点二里面的代码全部执行完毕线程出来锁自动打开
//锁对象一定是唯一的一般是锁对象的字节码文件对象
synchronized(thread.class);同步方法把synchronized关键字加到方法上
格式:修饰符 synchronized 返回值类型 方法名(方法参数){...}
//特点一同步方法是锁住方法里面的所有方法
//特点二锁对象不能自己指定非静态方法this静态方法当前类的字节码文件对象为了更加清晰的表达如何释放锁获得锁JDK5之后提供了一个锁对象Lock
void lock()//获得锁
void unlock()//释放锁//手动释放锁手动获得锁Lock是接口不能被直接实例化使用它的实现类ReentrantLock来实例化
死锁
出现了锁的嵌套
产生因素
1、系统拥有的资源数量 2、资源分配策略 3、进程对资源的使用要求 4、并发进程的推荐顺序
必要条件
互斥条件进程互斥使用资源占有和等待条件进程申请资源得不到时不会释放已经占有的资源不剥夺条件一个进程不能抢占其他进程的资源循环等待条件存在一组进程循环等待资源
死锁的防止
破坏产生死锁的任意一个条件即可
生产者和消费者(等待唤醒机制)
生产者生产数据
消费者消费数据
常见方法
public void wait();//当前线程等待知道被其他线程唤醒public void notify();//随机唤醒一个线程public void notifyAll();//唤醒所有线程线程的状态 新建状态(new) - 创建线程对象就绪状态(Runnable) - start方法阻塞状态(blocked) - 无法获得锁对象等待状态(waiting) - wait方法 计时状态(timed_waiting) - sleep方法结束状态(terminated) - 全部代码运行完毕线程池
以前使用多线程的弊端
用到线程时就创建
用完之后线程消失
这样会浪费操作系统的资源
线程池类似于一个容器里面有线程需要用到线程时直接取即可用完还回去。
线程池有最大线程数量限制可以自己设置
1. 创建一个空池子
2. 提交任务时池子会创建新的线程对象任务执行完毕归还线程对象到线程池下次调用时直接使用不需要创建
3. 如果提交任务时没有空闲线程也无法创建新的线程任务就会排队等待线程池类似于一个容器里面有线程需要用到线程时直接取即可用完还回去。
线程池有最大线程数量限制可以自己设置
1. 创建一个空池子
2. 提交任务时池子会创建新的线程对象任务执行完毕归还线程对象到线程池下次调用时直接使用不需要创建
3. 如果提交任务时没有空闲线程也无法创建新的线程任务就会排队等待