多线程

xiaoxiao2021-02-28  143

本文为个人学习随笔 供自己日后参考 欢迎借鉴 更乐于接受指正

线程概念:进程是操作系统结构的基础 是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。简单的说,当我们启动一个应用程序,就会有个进程  一个进程中有多个线程 线程是程序执行流的最小单元  在多核CPU的支持下 线程仍然会在单核中运行,如未指明优先级,将随机争夺CPU的资源也叫做时间片

线程的状态:1 新建状态 2就绪状态 3运行状态 4阻塞状态 5死亡状态

多线程的应用:多线程用于堆积处理,就像一个大土堆,一个推土机很慢,那么10个推土机一起来处理,当然速度就快了,不过由于位置的限制,如果20个推土机,那么推土机之间会产生相互的避让,相互摩擦,相互拥挤,反而不如10个处理的好,所以,多线程处理,线程数要开的恰当,就可以提高效率

多线程的好处:1 充分利用CPU资源 2 简化编程模型 3 简化异步事件的处理 4 使用GUI更有效率 5 节约成本

多线程好处固然多 可在使用中带来很多新麻烦 比如线程死锁 死锁造成原因主要有 系统资源不足 线程推进的顺序不恰当 资源分配不当

解决死锁主要通过线程通信来实现

三个方法 wait() notify() notifyAll()

class NumberPrint implements Runnable{ private int number; public byte res[]; public static int count = 5; public NumberPrint(int number, byte a[]){ this.number = number; res = a; } public void run(){ synchronized (res){ while(count-- > 0){ try { res.notify();//唤醒等待res资源的线程,把锁交给线程(该同步锁执行完毕自动释放锁) System.out.println(" "+number); res.wait();//释放CPU控制权,释放res的锁,本线程阻塞,等待被唤醒。 System.out.println("------线程"+Thread.currentThread().getName()+"获得锁,wait()后的代码继续运行:"+number); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }//end of while return; }//synchronized } } public class WaitNotify { public static void main(String args[]){ final byte a[] = {0};//以该对象为共享资源 new Thread(new NumberPrint((1),a),"1").start(); new Thread(new NumberPrint((2),a),"2").start(); } }

线程池:

ExecutorService pool = Executors. newSingleThreadExecutor();   //单个线程运行 如果出现异常会由下一个线程补上 否则一个线程会做完全部的事 ExecutorService pool = Executors.newFixedThreadPool(2);  //线程的运行顺序其实还是交替运行 ExecutorService pool = Executors.newCachedThreadPool();  //缓存线程池 空闲线程会在指定时间内被回收 建议使用    ExecutorService pool =Executors.newSingleThreadExecutor();     //大小无限制的线程池

单例下的饿汉与懒汉模式 参考:http://www.cnblogs.com/chengpeng15/p/5933969.html

日后关于线程的问题还会继续更新

转载请注明原文地址: https://www.6miu.com/read-34804.html

最新回复(0)