4-2 多线程-1

一、 并发与并行

并发:指两个或多个事件在同一个时间段内发生。 (交替执行)
并行:指两个或多个事件在同一时刻发生。(同时执行)(速度较快)

二、 线程与进程

进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创 建、运行到消亡的过程。

线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程 中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

线程调度:

分时调度 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为 抢占式调度。

抢占式调度详解: 大部分操作系统都支持多进程并发运行,现在的操作系统几乎都支持同时运行多个程序。此时,这些程序是 在同时运行,”感觉这些软件好像在同一时刻运行着“。 实际上,CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高
 

三、创建线程类

方法一:创建Thread的子类

Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是Thread类或其子类的实例

实现步骤:
1:创建一个类继承Thread类
2:重写Thread类的run方法,设置线程任务。(即开启线程后该做什么?)
3:创建该类的对象。
4:调用Thread类中的start方法开启线程(开始执行run方法中的代码)。
         void start()使该线程开始执行;java虚拟机调用线程的run方法。结果是两个线程并发的运行。当前线程(main)和另一个线程(创建的新线程)
注意:多次启动一个线程是非法的,特别是当线程已经结束执行后,不能再重新启动
java程序属于抢占式调度,优先执行优先级高的线程,优先级相同时,随机执行

 

方法二:实现Runnable接口

java.lang.Runnable  Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。类必需定义一个成为run的无参方法
java.lang.Thread类中的构造方法:
           Thread(Runnable  target)  分配新的thread对象
           Thread(Runnable  target,String  name)  分配新的thread对象,name为设置的线程名

实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnable接口中的run方法,设置线程任务。
3.创建一个Runnable接口的实现类的对象 a
4.创建Thread对象 b,构造方法中传递 a
5.调用Thread类中的start方法(b.start();),开启新线程执行run方法

实现Runnable接口创建多线程程序的好处:
1.避免了单继承的局限性
       一个类只能继承一个类,类继承了Thread类就不能再继承其他类,实现Runnable接口还可以继承其他类,实现其他接口
2.增强了程序的拓展性,降低了程序的耦合性(解耦)
      实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
      实现类中,重写run方法来设置线程任务;||  创建Thread类对象来调用start方法,开启新线程

注:匿名内部类方式实现线程的创建       
作用:简化代码
       把子类继承父类,重写父类方法,创建子类对象一步完成
       把实现类实现类接口,重写接口方法,创建实现类对象一步完成
匿名内部类的最终产物:子类/实现类对象(但这个对象并没有名字)

格式: 
         new  父类/接口(){
         重写父类/接口的方法;
}


多线程的原理:

程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用mt的对象的 start方法,另外一个新的线程也启动了,这样,整个应用就在多线程下运行。每次新增一个线程,都会再创建一个栈内存,每个线程在不同的栈空间内互不影响。
多线程执行时,在栈内存中,其实每一个执行线程都有一片自己独立的栈内存空间。进行方法的压栈和弹栈。

 

四:Thread中的常用方法

获取线程的名称:
1.使用Thread类中的getName()方法,返回该线程的名称
2.先获取当前正在执行的线程,再使用该线程中的getName方法获取名称
        static  Thread   currentThread();返回对当前正在执行的线程对象的引用

 设置线程的名称
1.使用Thread中的setName(name)方法
2.给Thread的子类创建一个带参构造,参数是线程的名称,并且调用父类的带参构造方法,super(name)设置线程名。

线程暂停
public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。



 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值