多线程
多线程概述:进程,线程。
进程:正在运行的程序。是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源
多进程有什么意义:单进程计算机只能做一个事情,一边玩游戏和听音乐
线程:是程序的执行单元,执行路径。是程序使用CPU的基本单位;
多线程有什么意义
不是提高程序的执行速度。其实是为了提高应用程序的使用率,线程的执行有随机性
并行和并发:前者逻辑上同时发生,指某一个时间断内同时运行多个程序;
后者 点 。
Java程序运行原理:由java命名启动JVM,JVM启动就相当于启动一个进程,接着有该进程创建了一个主线程去调用main方法。
多线程实现:
方式1:继承Thread类
步骤
A:自定义类MyThread继承Thread类
B:MyThread类里面重写run()
C:创建对象
d:启动线程
d:启动方式调用start()方法:启动+运行一次run()有且只能调用一次。
获取线程名称:
public final String getName();
设置线程名称:
public final void setName(String name); PS:跟自定义类一样
获取当前线程名称:
public ststic Thread currentThread();
Thread currentThread.getname();
线程调度:分时调度(平分时间),抢占式调度模型(按优先级)。
Java用抢占式:
public final int getPriority();返回线程优先级:
注意:默认优先级5
设置优先级:
public final void setPriority():修改优先级
优先级范围1-10;越大越好几率越高
线程休眠:
public static void sleep(long millis)暂停millis毫秒
线程假如:
public final void join()等待该线程终止
线程暂停:
public static void yield():暂停当前执行的线程对象,并执行其他线程,让执行看起来很和谐
后台线程:
public final void setDeamon(boolean on)设置守护线程,该线程走完其他线程都结束,必须在启动前调用(死前可以板俩下)
中断线程:
public final void stop()让线程停止,过时了
public void interrupt()中断线程,把线程状态终止并抛出一个InterruptedException.
线程生命周期:
新建--就绪--运行--死亡
阻塞--就绪--运行--死亡
多线程实现方案2:实现Runnable接口
步骤: A:自定义MyRunnable师兄Runnable接口
B:重写run方法
C:创建MyRunnable类的对象
D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
解决单继承的局限性,适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的提醒了面向对象的思想
同步代码块:
synchronized(对象){
需要同步的代码
}
另一个锁:Lock(接口)
获取锁:
public void lock()
释放锁:
public void unlock()
实现类ReentrantLock;
死锁问题:
同步:效率低,嵌套时候容易产生死锁
死锁:指俩个或者俩个以上的线程在争夺资源的过程中,发生的一种相互等待的现象。
解决:线程间通信问题:不同种类的线程间针对同一个资源的操作
生存者消费者同一把锁
public void wait();等待
notify();唤醒单个线程
notifyAll();所有
线程组:使用ThreadGroup
public final ThreadGroup getThreadGroup();
public final String getname();
线程池:Executors工厂类.
public static ExecutService newCacherThreadPool():
FixedThreadPool(int nThreads);创建几个线程
SingleThreadExecutor();
结束线程池:
shutdown();
匿名内部类多线程使用:new Thread(){public void run(){}}.start();
了解:
定时器:定期执行程序
Timer(定时)和TimerTask(任务)类
public Timer()
public void schedule(TimeTask task,long delay)
( ,long period)
cancel()
网友评论