多线程
什么是线程,进程
线程是指程序在执行过程中,能够执行程序代码的一个执行单元;主要状态有四种:运行、就绪、挂起和结束。
进程是指一段正在执行的程序;进程可以有多个线程。
多线程的优点
- 使用多线程可以减少程序的相应时间
- 与进程相比,线程的创建和切换开销更小
- 多CPU或者多核计算机本身就具有执行多线程的能力,可以提高cpu的利用率
- 使用多线程可以简化程序的结构,使程序更加便于理解和维护。
多线程实现方法
- 继承 Thread 类,重写run()方法;
- 实现 Runnable 接口,并实现该接口的 run() 方法
- 实现 Callable 接口,重写 call() 方法
- 线程池的使用
run() start()方法有什么区别
通过调用线程类的 start() 方法,才能运行真正的多线程。直接调用 run() 方法,是不能运行真正的多线程的。系统通过调用线程类的 start() 方法启动一个线程,JVM 通过调用 run() 方法,来完成实际的操作。
多线程同步的实现方法
同步方法
即有synchronized关键字修饰的方法。
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,
内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
public synchronized void save(){
}
注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类
同步代码块
即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
代码如:
synchronized(object){
}
注:同步是一种高开销的操作,因此应该尽量减少同步的内容。
通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
package com.xhj.thread;
/**
* 线程同步的运用
*/
public class SynchronizedThread {
class Bank {
private int account = 100;
public int getAccount() {
return account;
}
/**
* 用同步方法实现
* @param money
*/
public synchronized void save(int money) {
account += money;
}
/**
* 用同步代码块实现
*
* @param money
*/
public void save1