线程的使用方法:
Thread 类中的方法:
休眠: sleep
强制执行:join
礼让: yield
线程的优先级:默认的优先级 main方法中优先级5
设置和 取得 setPriority getPriority
线程的中断 interrupt
线程的同步 与异步
1线程的命名与取得
线程的运行状态是不确定,如果在不确定的线程中操作一个线程只能依靠线程的名字,线程的名字是非常重要的概念,在Thread方法中提供有线程的命名与取得的方法
1 构造方法: public Thread(Stirng name);
2 public final String getName(); 取得线程的名称
3 public final void setName(String name); 设置线程名称
通过以上的三个方法可以完成线程的命名与取得,但是并不能通过以上方法取得线程当前的对象
线程的休眠
public static native void sleep(long millis) throws InterruptedException; |
如果现在希望一个程序跑的慢一点,或者说暂缓执行,可以使用Thread类中提供的sleep()方
完成
该方法需要的参数 long类型的毫秒时间
3 线程的终断
在Thread类中里面提供了线程的终断的方法
public static boolean interrupted() |
通过以上方法可以让一个叫做正在休眠的线程终断休眠
public static boolean interrupted() |
以上方法可以判断一个线程是否已经被打断,已经被打断线程不能再次被打断
如果希望一个线程可以强制执行则可以使用Thread类提供的一个Join方法
public final void join() throws InterruptedException |
通过以上的join方法可以让一个线程抢占资源一直执行,等到线程执行完毕之后其他线程才可以执行
5 线程的礼让
public static native void yield(); |
所谓线程的礼让就是在执行的时候当前不执行,先让别的线程执行.在Thread中提供了一个方法
6 线程的优先级
线程的执行的时候是可以设置优先级的,理论上来说谁的优先级高谁就先执行,但是在线程中优先级也是一个叫做相对的概念,而不是绝对的。
在Thread类中提供了设置优先级与取得优先级的方法
public final void setPriority(int newPriority) |
1 设置优先级
观察以上方法 在设置优先级的时候参数为int类型 说明优先级在线程中是用数字表示的
在Thread中定义了如下的常量可以设置优先级的大小
public final static int MIN_PRIORITY = 1; 表示最小优先级 |
public final static int NORM_PRIORITY = 5; 中等优先级 |
public final static int MAX_PRIORITY = 10; 最大优先级 |
2 获取优先级
public final int getPriority() ; |
设置优先级之后线程的执行也不是按照优先级执行的,优先级只会对线程增加执行的概率而已
取得优先级:
范例:取得主线程的优先级
System.out.println(Thread.currentThread().getPriority()); |
通过取得主线程的优先级可以发现主线程是对应的中等优先级
以上几个方法都定义在Thread类中
线程的同步与死锁
在多线程中Thread描述的是一个个线程对象,而Runnable描述的是资源,当多个线程对象同时访问同一资源,操作不当的情况下会产生数据的错误
多个对象同时访问一个资源的时候,由于多个对象在抢占资源,有可能多个对象同一时间对资源进行修改,这样就造成了数据的不同步
如果想要让线程不出现数据错误的现象则需要 在操作的资源上加上同步锁,则这样之后每一个线程对象在操作的资源的时候 后面线程对象会等到之前的线程对象操作完毕之后才会进行资源的操作
同步和异步:
异步:多个线程对象可以同一时间对资源进行访问
同步:同一时间只能有一个线程在操作资源,剩下的线程只能等待上一个线程操作完毕之后在进行资源的操作
性能上的区别:
同步: 由于每个线程只能单独进行资源的操作,所以效率不高
异步:异步处理由于多个线程可以同时进行资源的访问 效率很高 但是不安全
在多线程中可以用两种方式实现同步锁:
关键字:synchronized 这个单词必须能默写出来
通过以上的关键字就可以实现两种方式:
1 同步代码块
synchronized {} |
2 同步方法
public synchronized boolean safe() |
在方法中存在变量是不会出现异步执行的,只有成员变量中才会出现异步执行
死锁:
线程死锁表示两个线程互相等待对方执行的过程,造成程序中假死现象(死机 卡了)
扩展: 数据结构-队列
队列又称为一种线性表, 特点:只能在一端进行插入 另一端进行删除,在插入端叫做队尾,删除端叫做队头
为队列设计操作方法:
1 入队
2 出队
3 判断队列是否为空
4 取得队头元素
队列又分为顺序队列和循环队列
顺序队列存在假溢出的问题
由于顺序队列存在假溢出的问题,所以可以使用循环队列解决 特点:队头和队尾首尾相连
在循环队列中解决假溢出的问题:
判断是否为空队列
计数元素的个数
少使用一个空间
少使用一个空间的情况下:
(队尾+1)%maxSize=front(队头)
线程的案例:
生产者与消费者
生产者负责生产 消费者取走
线程的等待与唤醒
Object类存在以下方法
1 线程的等待
public final void wait(); |
public final native void wait(long timeout) 根据时间等待 |
2 线程的唤醒
public final native void notify(); 唤醒第一个等待的线程 |
public final native void notifyAll(); 唤醒所有等待的线程 |