什么是线程
- 进程的概念:进程是指可执行程序并存放在计算机存储器的一个指令序列,它是一个动态执行的过程。
- 线程是比进程还要小的运行单位,一个进程包含多个线程
- 线程可以看做一个子程序
线程的创建
- 创建一个Thread类,或者一个Thread子类的对象
- 创建一个实现Runnable接口的类的对象
通过继承Thread类创建线程(MyThread )new MyThread().start()
通过实现Runnable接口创建线程(MyRunnable)new Thread(new MyRunnable()).start()
Thread类
- Thread是一个线程类,位于java.lang包下
- Thread类的常用方法
Runnable接口
- 只有一个方法run)
- Runnable是Java中用以实现线程的接口
- 任何实现线程功能的类都必须实现该接口
通过Thread类创建线程
class MyThread extends Thread{
public MyThread(String name){
super(name);
}
public void run(){
for(int i=1;i<=10;i++){
System.out.println(getName()+"正在运行"+i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
MyThread mt1=new MyThread("线程1");
MyThread mt2=new MyThread("线程2");
mt1.start();
mt2.start();
}
}
//输出多次代码,可以发现线程去获取cpu使用权是随机的
通过Runnable接口创建线程
- 为什么要实现Runnable接口?
-Java不支持多继承
-不打算重写Thread类的其他方法,一般来说我们只需要重写一个run方法就好了,所以实现Runnable接口应用的更广泛一些
class PrintRunnable implements Runnable {
@Override
public void run() {
int i = 1;
while (i <= 10)
System.out.println(Thread.currentThread().getName() + "正在运行" + (i++));
}
}
public class Test {
public static void main(String[] args) {
PrintRunnable pr = new PrintRunnable();
Thread t1 = new Thread(pr);
t1.start();
PrintRunnable pr1 = new PrintRunnable();
Thread t2 = new Thread(pr1);
t2.start();
}
}
线程的状态
- 新建(New )
- 可运行(Runnable )
- 正在运行(Running )
- 阻塞(Blocked )
- 终止(Dead)
线程的生命周期
Sleep方法应用
- Thread类的方法
- 作用:在指定的毫秒数内让正在执行的线程休眠(暂停执行)
- 参数为休眠的时间,单位是毫秒
public static void sleep(long millis)
join方法的应用
- Thread类的方法
- 作用:等待调用该方法的线程结束后才能执行
public static void join()
public static void join(long millis)
线程优先级
- Java为线程类提供了10个优先级
- 优先级可以用整数1-10表示,超过范围会抛出异常
- 主线程默认优先级为5
- 数字越大优先级越高
- MAX_PRIORITY:线程的最高优先级10
- MIN_PRIORITY:线程的最低优先级1
- NORM_PRIORITY:线程的默认优先级5
多线程的运行问题
- 各个线程是通过竞争CPU时间而获得运行机会的
- 各线程什么时候得到CPU时间,占用多久,是不可预测的
- 一个正在运行着的线程在什么地方被暂停是不确定的
线程同步
- synchronized关键字用在
-成员方法
-静态方法
-语句块
public synchronized void saveAccount(){}
public static synchronized void saveAccount(){}
synchronized (obj){.…}
线程间的通信
- wait()方法∶中断方法的执行,使线程等待
- notify()方法∶唤醒处于等待的某一个线程,使其结束等待
- notifyAll()方法︰唤醒所有处于等待的线程,使它们结束等待