程序:静态代码,在没有运行前就是写在磁盘上的代码。
进程:动态概念,程序的一次执行,它对应了代码从加载,运行,执行完毕的一系列过程。
线程:动态概念,在一个进程中可以独立运行的代码块,一个进程中可以产生多个线程。一个线程就是程序内部的一条执行线索。当程序
中要实现两段代码同时交替运行,就要用到多线程。一般在子线程中做耗时操作,例如:网络加载数据、视频图像的处理、文件的读写等。
多线程:
一般通过以下两种方式自定义线程类:
1、创建java.lang.Thread类的子类,重写该类的run方法
2、创建java.lang.Runnable接口的实现类,实现接口中的run方法
多线程的核心在于多个代码块并发执行,本质特点在于各代码块之间的代码是乱序执行的
(一)Thread
Java的线程通过Thread类来控制,一个Thread类的对象代表一个线程,而且只能代表一个线程。
通过Thread类和它定义的对象,我们能获得当前线程对象、获取某一线程的名称、可以实现控制线程暂停一段时间等功能。
每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
使用start()方法,线程进入Runnable(可运行)状态,它将向线程调度器注册这个线程。
调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnable 而不是Running。
注意,不要直接在程序中调用线程的run()方法。(二)Runnable
Runnable接口
java.lang.Runnable接口中只有一个未实现的run方法,实现该接口的类必须重写该方法。
Runnable接口与Thread类之间的区别
Runnable接口必须实现run方法,而Thread类中的run方法是一个空方法,可以不重写
Runnable接口的实现类并不是真正的线程类,只是线程运行的目标类。要想以线程的方式执行run方法,必须依靠Thread类 。
为了防止共享对象在并发访问时出现错误,Java中提供了“synchronized”关键字。
synchronized:确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。
比较:
实现Runnable接口相对于继承Thread类来说,有如下的显著优势:
1.适合多个相同代码的线程去处理同一个资源的情况
2.可以避免由于java的单继承特性带来的局限
3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
1.适合多个相同代码的线程去处理同一个资源的情况
2.可以避免由于java的单继承特性带来的局限
3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
1、修饰方法
被“synchronized”关键字修饰的方法称为“同步方法”
//定义同步方法
public synchronized void methd(){
//方法实现
}
当一个线程访问对象的同步方法时,被访问对象就处于“锁定”状态,访问该方法的其他线程只能等待
2、修饰部分代码
如果只希望同步部分代码行,可以使用“同步块”
如果只希望同步部分代码行,可以使用“同步块”
//同步块
synchronized(obj){
//被同步的代码块
}
wait()方法:(对象方法,不是线程的方法)
中断方法的执行,使本线程等待,暂时让出cpu的使用权,并允许其他线程使用这个同步方法。
当一个线程使用的同步方法中用到某个变量,而此变量又
需要其他线程修改后才能符合本线程的需要,
那么可以在同步方法中使用wait()方法
notify()方法:
唤醒由于使用这个同步方法而处于等待线程的某一个结束等待
notifyall()方法:
唤醒所有由于使用这个同步方法而处于等待的线程结束等待

浙公网安备 33010602011771号