首页 > 代码库 > 多线程
多线程
进程的特点:
1.进程是系统运行程序的基本单位
2.每一个进程都有自己独立的一块内存空间,一组系统资源
3.每一个进程的内部数据和状态都是完全独立的
线程是程序总执行的最小单位
线程和进程的联系及区别:
一个进程中至少要有一个线程
资源分配给进程,同一进程的所有线程共享该进程的所有资源
处理机分配给线程,即真正在处理机上运行的是线程
线程调度方法:
1.join()方法
使当前线程暂停执行,等待调用该方法的线程结束后再继续执行本线程.
2.sleep()方法
当前线程睡眠(毫秒),线程有运行中的状态进入不可运行状态,睡眠时间过后线程会再进入可运行状态
3.yield()方法
暂停当前线程运行,允许其他线程执行,该线程仍处于可运行状态,不转为阻塞状态.此时,系统选择其他相同或更高优先级的线程执行,若无
其他相同或更高优先级线程,则该线程继续执行.
sleep()方法和yield()方法区别
slee()方法 yiled()方法
使当前线程进入被阻塞的状态 使当前线程转入暂停执行的状态
即使没有其他等待运行的线程,当前线程 如果没有其他等待执行的线程,当前线程会马上恢复执行
也会等待指定的时间
其他等待执行的线程的机会是均等的 会将优先级相同或更高的线程运行
1.多线程的三种实现方式
1,继承Thread类
a:创建一个自定义类继承Thread类,重写run方法
b:在准备执行的代码中创建自定义线程对象
c:开启线程使用start方法,多次开启同一个线程是非法的
2,实现Runnable接口
a:创建一个Runnable接口的实现类,实现run方法
b:在准备执行的代码中创建Runnable接口的实现类对象
c:使用Thread类中的带参数构造方法将Runnable接口的实现类作为参数传递
d:开启线程
3,匿名对象和匿名内部类方式实现多线程
2.多线程的方法
a:优先级越高说明抢占到CPU的概率越大,跟先后执行没有关系
b:线程的join方法就是线程插队,插队就是说被插队的线程要停止执行,
放弃CPU使用权给插队者执行代码,直到插队的线程执行完毕后,被插队的线程才能开始执行
c:sleep方法是Thread类中的静态方法,可以通过类名直接调用即可,功能是让当前正在执行的线程暂停执行,暂停的时间由参数来确定
3.同步代码块和同步方法
a:synchronized (object) {
System.out.print("世");
System.out.print("界");
System.out.print("你");
System.out.println("好!");
}
在CPU执行到这段代码的时候,不希望被别的线程抢去CPU
同步代码块中的锁可以是任意的对象
b:同步方法和同步代码块的区别是:同步代码块只是被包含的代码在执行的时候不会被别人抢去CPU
同步方法的特点是方法在执行的时候不会被别人抢去CPU
4.线程间通信
a:非静态的同步方法的锁是this
b:同步代码块的话是任意的对象
方法:
wait()方法:调用wait()方法,会挂起当前线程,并释放共享资源的锁.
notify()方法:调用任意对象的notify()方法会在因调用该对象的wait()方法而阻塞的线程中随机选择一个解除阻塞,但要等到获得锁后才可真正执行.
notifyAll()方法:调用了notifyAll()方法会将因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞.
====>Object类的final方法,被所有的类继承且不允许重写.只能在同步方法或者同步代码块中使用,否则会抛出异常.
多线程