多线程
概述
线程
线程是比进程更小的执行单位,一个进程包含多个线程
可以看做为子程序
进程概念
进程是指可执行程序并存放在计算机存储器中的一个指令序列,它是一个动态执行的过程
多线程机制
时间片轮转
线程的创建
创建一个Thread类,或者一个Thread子类的对象
创建一个实现Runnable接口的类的对象
Thread类
继承自Object类
实现了Runnable接口
Runnable接口
只有一个方法run();任何与线程相关的代码都写入run方法里面
Runnable是Java中用以实现线程的接口
任何实现线程功能的类都必须实现该接口
线程的创建
通过Thread继承方法创建线程
线程要单独用一个类来继承
public class MyThread extends Thread{
重写run方法
public void run(){}
}
实现线程的类要实例化并使用start()方法运行线程
public class ThreadTest{
main(){thread.start()}
}
通过Runnable接口创建线程
为什么要用实现Runnable接口创建线程
1.Java不支持多继承
2.不打算重写Thread类的其他方法
线程的生命周期
线程的状态
1.新建(New)
2.可运行(Runnable)
3.正在运行(Running)
4.阻塞(Blocked)
5.终止(Dead)
sleep方法应用
Thread类的方法
public static void sleep(long millis)
作用:在指定的毫秒数内让正在执行的线程休眠(暂停执行)
参数为休眠的时间,单位是毫秒
join方法应用
Thread类的方法
public fianl void join()
作用:等待调用该方法的线程结束后才能执行
public final void join(long millis)
作用:等待该线程终止的最长时间为millis毫秒
如果millis为0则意味着要一直等下去。
线程的优先级
Java为线程类提供了10个优先级。
优先级可以用整数1-10表示,超过范围会抛出异常
主线程默认优先级为5
优先级常量:
MAX_PRIORITY:线程的最高优先级10
MIN_PRIORITY:线程的最低优先级1
NORM_PRIORITY:线程的默认优先级5
优先级方法:
public int getPriority()
获取优先级的方法
public void setPriority(int newPriority)
设置优先级的方法
线程同步
多线程运行问题
各个线程是通过竞争CPU时间而获得运行机会的
各线程什么时候得到CPU时间,占用多久,是不可预测的。
一个正在运行着的线程在什么地方被暂停是不确定的。
同步关键字
使用关键字synchronized实现(同步关键字)
synchronized关键字用在
成员方法、静态方法或语句块
public synchronized void 方法名()
或
public static synchronized void 方法名()
或
synchronized(obj){}
线程间通信
wait()方法:中断方法的执行,使线程等待
notify()方法:唤醒处于等待的某个线程,使其结束等待
notifyAll()方法:唤醒所有处于等待的线程,使他们结束等待
更多体现的是操作系统中的PV操作
private int n;
boolean flag=false;
public synchronized int get() {
if(!flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费:"+n);
flag=false;//消费完毕,容器中没有数据
notifyAll();
return n;
}
public synchronized void set(int n) {
if(flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("生产:"+n);
this.n = n;
flag=true;//生产完毕,容器中已经有数据
notifyAll();
}