线程的概念 程序:Program,是一个指令的集合 进程:Process,(正在执行中的程序)是一个静态的概念 进程是程序的一次静态态执行过程, 占用特定的地址空间. 每个迚程都是独立的,由3部分组成cpu,data,code 缺点:内存的浪费,cpu的负担 线程:是进程中一个“单一的连续控制流程”(a singlesThread,equential flow of control)/执行路经线程又被称为轻量级进程(lightweight process)。 Threads run at the same time, independently of one another 一个进程可拥有多个并行的(concurrent)线程 一个进程中的线程共享相同的内存单元/内存地址空间 可以访问相同的变量和对象,而且它们从同一堆中分配对象通信、数据交换、同步操作 由亍线程间的通信是在同一地址空间上迚行的,所以丌需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。 当多个线程共同访问同一个资源的时候,会出现线程安全问题,此时解决办法之一是加锁, 在java中要求锁是对象类型,任何对象都是可以的,但是需要保证多个线程访问的是同一把锁。 程序中锁的名称特别的锁: 1、锁旗标; 2、同步监视器; 3、同步锁; 4、互斥锁; 5、对象锁; 6、锁...... 一个进程中至少有一个线程 Java虚拟机启动的时候会有一个进程java.exe,该进程中至少有一个线程,在负责java程序的执行。而且这个线程运行的代码存在亍main方法中,该线程称之为主线程。 一个进程中的线程共享代码和数据空间 线程结束,进程未毕结束,但进程结束,线程一定结束 进程中包含线程,线程是进程的一部分
JAVA中实现多线程
在Java中负责线程的这个功能的是Java.lang.Thread 这个类
可以通过创建 Thread 的实例来创建新的线程。
每个线程都是通过某个特定Thread对象所对应的方法run( )来完 成其操作的,方法run( )称为线程体。
通过调用Thead类的start()方法来启动一个线程。
创建线程的方式一继承Thread类
操作步骤:
【1】继承Thread类
【2】重写run方法
【3】创建对象,调用start()方法,启动线程
创建线程的方式——实现Runnable接口
操作步骤:
【1】实现Runnable接口
【2】重写run方法
【3】创建对象,调用start()方法,启动线程
继承Thread类方式的缺点:那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread类
通过Runnable接口实现多线程
优点:可以同时实现继承。实现Runnable接口方式要通用一些。
(1)避免单继承
(2)方便共享资源 同一份资源 多个代理访问
阻塞状态(sleep/yield/join方法)
有三种方法可以暂停Thread执行:
1. sleep:会释放锁,Sleep时别的线程也丌可以访问锁定对象。
2. yield:让出CPU的使用权,从运行态直接迚入就绪态。让CPU重新挑选哪一个线程迚入运行状态。
3. join:当某个线程等待另一个线程执行结束后,才继续执行时,使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行
使用同步解决线程的安全性问题
同步的前提:
(1)必须有两个或两个以上的线程
(2)必须是多个线程使用同一资源
(3)必须保证同步中只能有一个线程在运行
package producerAndConsumer;
//生产者和消费者共享的资源:商品
public class Goods {
private String brand;
private String name;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//消费者从共享区域中去商品(拿走商品)
public class Consumer implements Runnable {
private Goods goods;
public Consumer(Goods goods) {