JAVA语言学习-Day6
程序、进程、线程
程序:指令与数据的有序集合,静态概念
进程:执行程序的一次执行过程,动态概念。是系统分配资源的单位
线程:一个进程中至少包含一个线程,通常一个进程中有若干个线程。线程是cpu调度和执行的单位
线程的创建
- 
继承thread类 
- 
实现runnable接口 
- 
实现callable接口 
线程开启不一定立即执行,由cpu调度执行
//start();主线程调用start,开辟子线程执行run,多条执行路径,主线程和子线程并行交替执行
//run(); 主线程执行run,只有主线程一条执行路径
//callabe
ExecutorService ser = Executors.newFixedThreadPool(10);//创建线程池,线程池连接数为10
Future<V> r1 = ser.submit(new MyThread());//提交执行
V rs = r1.get();//获取结果
ser.shutdownNow();//关闭服务
FutureTask<V> futureTask = new FutureTask<V>(new MyThread());
new Thread(futureTask).start();
V v = futureTask.get();//V泛型
System.out.println(V);
    
class MyThread implements callable<V>{
    
网图下载
//url网图地址,name保存的文件名
FileUtils.copyURLToFile(new URL(url),new File(name));
并发概念
多个线程同时操作同一个对象
静态代理
- 
真实对象和代理对象都要实现同一个接口 
- 
代理对象要代理真实角色 
Lambda表达式(jdk1.8)
- 
函数式接口 - 
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口 
- 
对于函数式接口,我们可以通过lambda表达式来创建该接口的对象 
 
- 
yield(线程礼让)
- 
礼让线程,让当前正在执行的线程暂停,但不阻塞 
- 
将线程从运行状态转为就绪状态 
- 
让cpu重新调度,礼让不一定成功 
Thread.yield();
join线程强制执行
- 
join合并线程,带此线程执行完成后,再执行其他线程,其他线程阻塞 
线程状态观测
- 
NEW:尚未执行的线程 
- 
RUNNABLE:在JAVA虚拟机中执行的线程 
- 
BLOCKED:被阻塞等待监视器锁定的线程 
- 
WAITING:正在等待另一个线程执行特定动作的线程 
- 
TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程 
- 
TERMINATED:已退出的线程 
Thread.state st = Thread.getState();
System.out.println(st);
守护线程(daemon)
- 
线程分为用户线程和守护线程 
- 
虚拟机必须确保用户线程执行完毕 
- 
虚拟机不必等待守护线程执行完毕 
new Thread().setDaemon(true);//默认false表示用户线程,正常的线程都是用户线程
线程同步机制
synchronized
并发:同一个对象被多个线程同时操作
形成条件:队列和锁
CopyOnWriteArrayList //线程安全的
死锁
- 
互斥条件:一个资源每次只能被一个进程使用 
- 
请求与保持条件:一个进程因请求资源而阻塞时,对已获取的资源保持不放 
- 
不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺 
- 
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系 
Lock锁(jdk1.5)
- 
Lock是显示锁(手动开启和关闭),synchronized是隐式锁,除了作用域自动释放 
- 
Lock只有代码块锁,synchronized有代码块锁和方法锁 
- 
使用Lock锁,jvm将花费较少的时间来调度线程,性能更好。并且具有更好的拓展性(提供更多子类) 
- 
优先使用顺序:Lock>同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体之外) 
private final ReentrantLock lock = new ReentrantLock();
try{
    lock.lock();
}catch(){
    
}finally{
    lock.unlock();
}
线程协作
生产者消费者问题
- 
假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费 
- 
如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止 
- 
如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止 
解决方式
- 
并发协作模型“生产者/消费者模式”--->管程法 - 
生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据 
 
- 
- 
并发协作模型“生产者/消费者模式”--->信号灯法 
线程池
- 
背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大 
- 
思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似现实生活中的公共交通工具 
- 
好处 - 
提高了响应速度(减少了创建新线程的时间) 
- 
降低资源消耗(重复利用线程池中的线程,不需要每次都创建) 
- 
便于线程管理(...) - 
corePoolSize:核心池的大小 
- 
maximumPoolSize:最大线程数 
- 
keeyAliveTime:线程没有任务时最多保持多长时间后会终止 
 
- 
 
- 
ExecutorService service = new Executor.newFixedThreadPool(10);
service.execute(new Thread());
service.shutdown();
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号